/*
wysihtml5 v0.3.0
https://github.com/xing/wysihtml5

Author: Christopher Blum (https://github.com/tiff)

Copyright (C) 2012 XING AG
Licensed under the MIT license (MIT)

Rangy, a cross-browser JavaScript range and selection library
http://code.google.com/p/rangy/

Copyright 2011, Tim Down
Licensed under the MIT license.
Version: 1.2.2
Build date: 13 November 2011
*/
var wysihtml5 = { version: "0.3.0", commands: {}, dom: {}, quirks: {}, toolbar: {}, lang: {}, selection: {}, views: {}, INVISIBLE_SPACE: "\ufeff", EMPTY_FUNCTION: function () { }, ELEMENT_NODE: 1, TEXT_NODE: 3, BACKSPACE_KEY: 8, ENTER_KEY: 13, ESCAPE_KEY: 27, SPACE_KEY: 32, DELETE_KEY: 46 };
window.rangy = function () {
    function b(a, b) { var c = typeof a[b]; return c == k || !!(c == h && a[b]) || "unknown" == c } function c(a, b) { return !!(typeof a[b] == h && a[b]) } function a(a, b) { return typeof a[b] != j } function d(a) { return function (b, c) { for (var d = c.length; d--; ) if (!a(b, c[d])) return !1; return !0 } } function e(a) { return a && m(a, r) && x(a, q) } function f(a) { window.alert("Rangy not supported in your browser. Reason: " + a); o.initialized = !0; o.supported = !1 } function g() {
        if (!o.initialized) {
            var a, d = !1, h = !1; b(document, "createRange") &&
(a = document.createRange(), m(a, p) && x(a, n) && (d = !0), a.detach()); if ((a = c(document, "body") ? document.body : document.getElementsByTagName("body")[0]) && b(a, "createTextRange")) a = a.createTextRange(), e(a) && (h = !0); !d && !h && f("Neither Range nor TextRange are implemented"); o.initialized = !0; o.features = { implementsDomRange: d, implementsTextRange: h }; d = w.concat(z); h = 0; for (a = d.length; h < a; ++h) try { d[h](o) } catch (j) {
                c(window, "console") && b(window.console, "log") && window.console.log("Init listener threw an exception. Continuing.",
j)
            } 
        } 
    } function i(a) { this.name = a; this.supported = this.initialized = !1 } var h = "object", k = "function", j = "undefined", n = "startContainer startOffset endContainer endOffset collapsed commonAncestorContainer START_TO_START START_TO_END END_TO_START END_TO_END".split(" "), p = "setStart setStartBefore setStartAfter setEnd setEndBefore setEndAfter collapse selectNode selectNodeContents compareBoundaryPoints deleteContents extractContents cloneContents insertNode surroundContents cloneRange toString detach".split(" "),
q = "boundingHeight boundingLeft boundingTop boundingWidth htmlText text".split(" "), r = "collapse compareEndPoints duplicate getBookmark moveToBookmark moveToElementText parentElement pasteHTML select setEndPoint getBoundingClientRect".split(" "), m = d(b), s = d(c), x = d(a), o = { version: "1.2.2", initialized: !1, supported: !0, util: { isHostMethod: b, isHostObject: c, isHostProperty: a, areHostMethods: m, areHostObjects: s, areHostProperties: x, isTextRange: e }, features: {}, modules: {}, config: { alertOnWarn: !1, preferTextRange: !1} };
    o.fail = f; o.warn = function (a) { a = "Rangy warning: " + a; o.config.alertOnWarn ? window.alert(a) : typeof window.console != j && typeof window.console.log != j && window.console.log(a) }; ({}).hasOwnProperty ? o.util.extend = function (a, b) { for (var c in b) b.hasOwnProperty(c) && (a[c] = b[c]) } : f("hasOwnProperty not supported"); var z = [], w = []; o.init = g; o.addInitListener = function (a) { o.initialized ? a(o) : z.push(a) }; var y = []; o.addCreateMissingNativeApiListener = function (a) { y.push(a) }; o.createMissingNativeApi = function (a) {
        a = a || window; g();
        for (var b = 0, c = y.length; b < c; ++b) y[b](a)
    }; i.prototype.fail = function (a) { this.initialized = !0; this.supported = !1; throw Error("Module '" + this.name + "' failed to load: " + a); }; i.prototype.warn = function (a) { o.warn("Module " + this.name + ": " + a) }; i.prototype.createError = function (a) { return Error("Error in Rangy " + this.name + " module: " + a) }; o.createModule = function (a, b) { var c = new i(a); o.modules[a] = c; w.push(function (a) { b(a, c); c.initialized = !0; c.supported = !0 }) }; o.requireModules = function (a) {
        for (var b = 0, c = a.length, d, h; b <
c; ++b) { h = a[b]; d = o.modules[h]; if (!d || !(d instanceof i)) throw Error("Module '" + h + "' not found"); if (!d.supported) throw Error("Module '" + h + "' not supported"); } 
    }; var A = !1, s = function () { A || (A = !0, o.initialized || g()) }; if (typeof window == j) f("No window found"); else if (typeof document == j) f("No document found"); else return b(document, "addEventListener") && document.addEventListener("DOMContentLoaded", s, !1), b(window, "addEventListener") ? window.addEventListener("load", s, !1) : b(window, "attachEvent") ? window.attachEvent("onload",
s) : f("Window does not have required addEventListener or attachEvent method"), o
} ();
rangy.createModule("DomUtil", function (b, c) {
    function a(a) { for (var b = 0; a = a.previousSibling; ) b++; return b } function d(a, b) { var c = [], d; for (d = a; d; d = d.parentNode) c.push(d); for (d = b; d; d = d.parentNode) if (m(c, d)) return d; return null } function e(a, b, c) { for (c = c ? a : a.parentNode; c; ) { a = c.parentNode; if (a === b) return c; c = a } return null } function f(a) { a = a.nodeType; return 3 == a || 4 == a || 8 == a } function g(a, b) { var c = b.nextSibling, d = b.parentNode; c ? d.insertBefore(a, c) : d.appendChild(a); return a } function i(a) {
        if (9 == a.nodeType) return a;
        if (typeof a.ownerDocument != p) return a.ownerDocument; if (typeof a.document != p) return a.document; if (a.parentNode) return i(a.parentNode); throw Error("getDocument: no document found for node");
    } function h(a) { return !a ? "[No node]" : f(a) ? '"' + a.data + '"' : 1 == a.nodeType ? "<" + a.nodeName + (a.id ? ' id="' + a.id + '"' : "") + ">[" + a.childNodes.length + "]" : a.nodeName } function k(a) { this._next = this.root = a } function j(a, b) { this.node = a; this.offset = b } function n(a) { this.code = this[a]; this.codeName = a; this.message = "DOMException: " + this.codeName }
    var p = "undefined", q = b.util; q.areHostMethods(document, ["createDocumentFragment", "createElement", "createTextNode"]) || c.fail("document missing a Node creation method"); q.isHostMethod(document, "getElementsByTagName") || c.fail("document missing getElementsByTagName method"); var r = document.createElement("div"); q.areHostMethods(r, ["insertBefore", "appendChild", "cloneNode"]) || c.fail("Incomplete Element implementation"); q.isHostProperty(r, "innerHTML") || c.fail("Element is missing innerHTML property"); r = document.createTextNode("test");
    q.areHostMethods(r, ["splitText", "deleteData", "insertData", "appendData", "cloneNode"]) || c.fail("Incomplete Text Node implementation"); var m = function (a, b) { for (var c = a.length; c--; ) if (a[c] === b) return !0; return !1 }; k.prototype = { _current: null, hasNext: function () { return !!this._next }, next: function () { var a = this._current = this._next, b; if (this._current) { b = a.firstChild; if (!b) for (b = null; a !== this.root && !(b = a.nextSibling); ) a = a.parentNode; this._next = b } return this._current }, detach: function () {
        this._current = this._next = this.root =
null
    } 
    }; j.prototype = { equals: function (a) { return this.node === a.node & this.offset == a.offset }, inspect: function () { return "[DomPosition(" + h(this.node) + ":" + this.offset + ")]" } }; n.prototype = { INDEX_SIZE_ERR: 1, HIERARCHY_REQUEST_ERR: 3, WRONG_DOCUMENT_ERR: 4, NO_MODIFICATION_ALLOWED_ERR: 7, NOT_FOUND_ERR: 8, NOT_SUPPORTED_ERR: 9, INVALID_STATE_ERR: 11 }; n.prototype.toString = function () { return this.message }; b.dom = { arrayContains: m, isHtmlNamespace: function (a) {
        var b; return typeof a.namespaceURI == p || null === (b = a.namespaceURI) || "http://www.w3.org/1999/xhtml" ==
b
    }, parentElement: function (a) { a = a.parentNode; return 1 == a.nodeType ? a : null }, getNodeIndex: a, getNodeLength: function (a) { var b; return f(a) ? a.length : (b = a.childNodes) ? b.length : 0 }, getCommonAncestor: d, isAncestorOf: function (a, b, c) { for (b = c ? b : b.parentNode; b; ) { if (b === a) return !0; b = b.parentNode } return !1 }, getClosestAncestorIn: e, isCharacterDataNode: f, insertAfter: g, splitDataNode: function (a, b) { var c = a.cloneNode(!1); c.deleteData(0, b); a.deleteData(b, a.length - b); g(c, a); return c }, getDocument: i, getWindow: function (a) {
        a = i(a);
        if (typeof a.defaultView != p) return a.defaultView; if (typeof a.parentWindow != p) return a.parentWindow; throw Error("Cannot get a window object for node");
    }, getIframeWindow: function (a) { if (typeof a.contentWindow != p) return a.contentWindow; if (typeof a.contentDocument != p) return a.contentDocument.defaultView; throw Error("getIframeWindow: No Window object found for iframe element"); }, getIframeDocument: function (a) {
        if (typeof a.contentDocument != p) return a.contentDocument; if (typeof a.contentWindow != p) return a.contentWindow.document;
        throw Error("getIframeWindow: No Document object found for iframe element");
    }, getBody: function (a) { return q.isHostObject(a, "body") ? a.body : a.getElementsByTagName("body")[0] }, getRootContainer: function (a) { for (var b; b = a.parentNode; ) a = b; return a }, comparePoints: function (b, c, h, j) {
        var k; if (b == h) return c === j ? 0 : c < j ? -1 : 1; if (k = e(h, b, !0)) return c <= a(k) ? -1 : 1; if (k = e(b, h, !0)) return a(k) < j ? -1 : 1; c = d(b, h); b = b === c ? c : e(b, c, !0); h = h === c ? c : e(h, c, !0); if (b === h) throw Error("comparePoints got to case 4 and childA and childB are the same!");
        for (c = c.firstChild; c; ) { if (c === b) return -1; if (c === h) return 1; c = c.nextSibling } throw Error("Should not be here!");
    }, inspectNode: h, fragmentFromNodeChildren: function (a) { for (var b = i(a).createDocumentFragment(), c; c = a.firstChild; ) b.appendChild(c); return b }, createIterator: function (a) { return new k(a) }, DomPosition: j
    }; b.DOMException = n
});
rangy.createModule("DomRange", function (b) {
    function c(a, b) { return 3 != a.nodeType && (l.isAncestorOf(a, b.startContainer, !0) || l.isAncestorOf(a, b.endContainer, !0)) } function a(a) { return l.getDocument(a.startContainer) } function d(a, b, c) { if (b = a._listeners[b]) for (var d = 0, h = b.length; d < h; ++d) b[d].call(a, { target: a, args: c }) } function e(a) { return new u(a.parentNode, l.getNodeIndex(a)) } function f(a) { return new u(a.parentNode, l.getNodeIndex(a) + 1) } function g(a, b, c) {
        var d = 11 == a.nodeType ? a.firstChild : a; l.isCharacterDataNode(b) ?
c == b.length ? l.insertAfter(a, b) : b.parentNode.insertBefore(a, 0 == c ? b : l.splitDataNode(b, c)) : c >= b.childNodes.length ? b.appendChild(a) : b.insertBefore(a, b.childNodes[c]); return d
    } function i(b) { for (var c, d, h = a(b.range).createDocumentFragment(); d = b.next(); ) { c = b.isPartiallySelectedSubtree(); d = d.cloneNode(!c); c && (c = b.getSubtreeIterator(), d.appendChild(i(c)), c.detach(!0)); if (10 == d.nodeType) throw new B("HIERARCHY_REQUEST_ERR"); h.appendChild(d) } return h } function h(a, b, c) {
        for (var d, e, c = c || { stop: !1 }; d = a.next(); ) if (a.isPartiallySelectedSubtree()) if (!1 ===
b(d)) { c.stop = !0; break } else { if (d = a.getSubtreeIterator(), h(d, b, c), d.detach(!0), c.stop) break } else for (d = l.createIterator(d); e = d.next(); ) if (!1 === b(e)) { c.stop = !0; return } 
    } function k(a) { for (var b; a.next(); ) a.isPartiallySelectedSubtree() ? (b = a.getSubtreeIterator(), k(b), b.detach(!0)) : a.remove() } function j(b) {
        for (var c, d = a(b.range).createDocumentFragment(), h; c = b.next(); ) {
            b.isPartiallySelectedSubtree() ? (c = c.cloneNode(!1), h = b.getSubtreeIterator(), c.appendChild(j(h)), h.detach(!0)) : b.remove(); if (10 == c.nodeType) throw new B("HIERARCHY_REQUEST_ERR");
            d.appendChild(c)
        } return d
    } function n(a, b, c) { var d = !(!b || !b.length), e, j = !!c; d && (e = RegExp("^(" + b.join("|") + ")$")); var k = []; h(new q(a, !1), function (a) { (!d || e.test(a.nodeType)) && (!j || c(a)) && k.push(a) }); return k } function p(a) { return "[" + ("undefined" == typeof a.getName ? "Range" : a.getName()) + "(" + l.inspectNode(a.startContainer) + ":" + a.startOffset + ", " + l.inspectNode(a.endContainer) + ":" + a.endOffset + ")]" } function q(a, b) {
        this.range = a; this.clonePartiallySelectedTextNodes = b; if (!a.collapsed) {
            this.sc = a.startContainer;
            this.so = a.startOffset; this.ec = a.endContainer; this.eo = a.endOffset; var c = a.commonAncestorContainer; this.sc === this.ec && l.isCharacterDataNode(this.sc) ? (this.isSingleCharacterDataNode = !0, this._first = this._last = this._next = this.sc) : (this._first = this._next = this.sc === c && !l.isCharacterDataNode(this.sc) ? this.sc.childNodes[this.so] : l.getClosestAncestorIn(this.sc, c, !0), this._last = this.ec === c && !l.isCharacterDataNode(this.ec) ? this.ec.childNodes[this.eo - 1] : l.getClosestAncestorIn(this.ec, c, !0))
        } 
    } function r(a) {
        this.code =
this[a]; this.codeName = a; this.message = "RangeException: " + this.codeName
    } function m(a, b, c) { this.nodes = n(a, b, c); this._next = this.nodes[0]; this._position = 0 } function s(a) { return function (b, c) { for (var d, h = c ? b : b.parentNode; h; ) { d = h.nodeType; if (l.arrayContains(a, d)) return h; h = h.parentNode } return null } } function x(a, b) { if ($(a, b)) throw new r("INVALID_NODE_TYPE_ERR"); } function o(a) { if (!a.startContainer) throw new B("INVALID_STATE_ERR"); } function z(a, b) {
        if (!l.arrayContains(b, a.nodeType)) throw new r("INVALID_NODE_TYPE_ERR");
    } function w(a, b) { if (0 > b || b > (l.isCharacterDataNode(a) ? a.length : a.childNodes.length)) throw new B("INDEX_SIZE_ERR"); } function y(a, b) { if (O(a, !0) !== O(b, !0)) throw new B("WRONG_DOCUMENT_ERR"); } function A(a) { if (aa(a, !0)) throw new B("NO_MODIFICATION_ALLOWED_ERR"); } function t(a, b) { if (!a) throw new B(b); } function v(a) {
        o(a); if (!l.arrayContains(G, a.startContainer.nodeType) && !O(a.startContainer, !0) || !l.arrayContains(G, a.endContainer.nodeType) && !O(a.endContainer, !0) || !(a.startOffset <= (l.isCharacterDataNode(a.startContainer) ?
a.startContainer.length : a.startContainer.childNodes.length)) || !(a.endOffset <= (l.isCharacterDataNode(a.endContainer) ? a.endContainer.length : a.endContainer.childNodes.length))) throw Error("Range error: Range is no longer valid after DOM mutation (" + a.inspect() + ")");
    } function D() { } function K(a) { a.START_TO_START = Q; a.START_TO_END = U; a.END_TO_END = ba; a.END_TO_START = V; a.NODE_BEFORE = W; a.NODE_AFTER = X; a.NODE_BEFORE_AND_AFTER = Y; a.NODE_INSIDE = R } function F(a) { K(a); K(a.prototype) } function E(a, b) {
        return function () {
            v(this);
            var c = this.startContainer, d = this.startOffset, e = this.commonAncestorContainer, j = new q(this, !0); c !== e && (c = l.getClosestAncestorIn(c, e, !0), d = f(c), c = d.node, d = d.offset); h(j, A); j.reset(); e = a(j); j.detach(); b(this, c, d, c, d); return e
        } 
    } function I(a, d, h) {
        function g(a, b) { return function (c) { o(this); z(c, L); z(M(c), G); c = (a ? e : f)(c); (b ? i : n)(this, c.node, c.offset) } } function i(a, b, c) {
            var h = a.endContainer, e = a.endOffset; if (b !== a.startContainer || c !== a.startOffset) {
                if (M(b) != M(h) || 1 == l.comparePoints(b, c, h, e)) h = b, e = c; d(a, b, c,
h, e)
            } 
        } function n(a, b, c) { var h = a.startContainer, e = a.startOffset; if (b !== a.endContainer || c !== a.endOffset) { if (M(b) != M(h) || -1 == l.comparePoints(b, c, h, e)) h = b, e = c; d(a, h, e, b, c) } } a.prototype = new D; b.util.extend(a.prototype, { setStart: function (a, b) { o(this); x(a, !0); w(a, b); i(this, a, b) }, setEnd: function (a, b) { o(this); x(a, !0); w(a, b); n(this, a, b) }, setStartBefore: g(!0, !0), setStartAfter: g(!1, !0), setEndBefore: g(!0, !1), setEndAfter: g(!1, !1), collapse: function (a) {
            v(this); a ? d(this, this.startContainer, this.startOffset, this.startContainer,
this.startOffset) : d(this, this.endContainer, this.endOffset, this.endContainer, this.endOffset)
        }, selectNodeContents: function (a) { o(this); x(a, !0); d(this, a, 0, a, l.getNodeLength(a)) }, selectNode: function (a) { o(this); x(a, !1); z(a, L); var b = e(a), a = f(a); d(this, b.node, b.offset, a.node, a.offset) }, extractContents: E(j, d), deleteContents: E(k, d), canSurroundContents: function () { v(this); A(this.startContainer); A(this.endContainer); var a = new q(this, !0), b = a._first && c(a._first, this) || a._last && c(a._last, this); a.detach(); return !b },
            detach: function () { h(this) }, splitBoundaries: function () { v(this); var a = this.startContainer, b = this.startOffset, c = this.endContainer, h = this.endOffset, e = a === c; l.isCharacterDataNode(c) && (0 < h && h < c.length) && l.splitDataNode(c, h); l.isCharacterDataNode(a) && (0 < b && b < a.length) && (a = l.splitDataNode(a, b), e ? (h -= b, c = a) : c == a.parentNode && h >= l.getNodeIndex(a) && h++, b = 0); d(this, a, b, c, h) }, normalizeBoundaries: function () {
                v(this); var a = this.startContainer, b = this.startOffset, c = this.endContainer, h = this.endOffset, e = function (a) {
                    var b =
a.nextSibling; b && b.nodeType == a.nodeType && (c = a, h = a.length, a.appendData(b.data), b.parentNode.removeChild(b))
                }, j = function (d) { var e = d.previousSibling; if (e && e.nodeType == d.nodeType) { a = d; var j = d.length; b = e.length; d.insertData(0, e.data); e.parentNode.removeChild(e); a == c ? (h += b, c = a) : c == d.parentNode && (e = l.getNodeIndex(d), h == e ? (c = d, h = j) : h > e && h--) } }, k = !0; l.isCharacterDataNode(c) ? c.length == h && e(c) : (0 < h && (k = c.childNodes[h - 1]) && l.isCharacterDataNode(k) && e(k), k = !this.collapsed); k ? l.isCharacterDataNode(a) ? 0 == b && j(a) :
b < a.childNodes.length && (e = a.childNodes[b]) && l.isCharacterDataNode(e) && j(e) : (a = c, b = h); d(this, a, b, c, h)
            }, collapseToPoint: function (a, b) { o(this); x(a, !0); w(a, b); (a !== this.startContainer || b !== this.startOffset || a !== this.endContainer || b !== this.endOffset) && d(this, a, b, a, b) } 
        }); F(a)
    } function N(a) { a.collapsed = a.startContainer === a.endContainer && a.startOffset === a.endOffset; a.commonAncestorContainer = a.collapsed ? a.startContainer : l.getCommonAncestor(a.startContainer, a.endContainer) } function J(a, b, c, h, e) {
        var j = a.startContainer !==
b || a.startOffset !== c, k = a.endContainer !== h || a.endOffset !== e; a.startContainer = b; a.startOffset = c; a.endContainer = h; a.endOffset = e; N(a); d(a, "boundarychange", { startMoved: j, endMoved: k })
    } function C(a) { this.startContainer = a; this.startOffset = 0; this.endContainer = a; this.endOffset = 0; this._listeners = { boundarychange: [], detach: [] }; N(this) } b.requireModules(["DomUtil"]); var l = b.dom, u = l.DomPosition, B = b.DOMException; q.prototype = { _current: null, _next: null, _first: null, _last: null, isSingleCharacterDataNode: !1, reset: function () {
        this._current =
null; this._next = this._first
    }, hasNext: function () { return !!this._next }, next: function () { var a = this._current = this._next; a && (this._next = a !== this._last ? a.nextSibling : null, l.isCharacterDataNode(a) && this.clonePartiallySelectedTextNodes && (a === this.ec && (a = a.cloneNode(!0)).deleteData(this.eo, a.length - this.eo), this._current === this.sc && (a = a.cloneNode(!0)).deleteData(0, this.so))); return a }, remove: function () {
        var a = this._current, b, c; l.isCharacterDataNode(a) && (a === this.sc || a === this.ec) ? (b = a === this.sc ? this.so : 0, c = a ===
this.ec ? this.eo : a.length, b != c && a.deleteData(b, c - b)) : a.parentNode && a.parentNode.removeChild(a)
    }, isPartiallySelectedSubtree: function () { return c(this._current, this.range) }, getSubtreeIterator: function () { var b; if (this.isSingleCharacterDataNode) b = this.range.cloneRange(), b.collapse(); else { b = new C(a(this.range)); var c = this._current, d = c, h = 0, e = c, j = l.getNodeLength(c); l.isAncestorOf(c, this.sc, !0) && (d = this.sc, h = this.so); l.isAncestorOf(c, this.ec, !0) && (e = this.ec, j = this.eo); J(b, d, h, e, j) } return new q(b, this.clonePartiallySelectedTextNodes) },
        detach: function (a) { a && this.range.detach(); this.range = this._current = this._next = this._first = this._last = this.sc = this.so = this.ec = this.eo = null } 
    }; r.prototype = { BAD_BOUNDARYPOINTS_ERR: 1, INVALID_NODE_TYPE_ERR: 2 }; r.prototype.toString = function () { return this.message }; m.prototype = { _current: null, hasNext: function () { return !!this._next }, next: function () { this._current = this._next; this._next = this.nodes[++this._position]; return this._current }, detach: function () { this._current = this._next = this.nodes = null } }; var L = [1, 3, 4, 5,
7, 8, 10], G = [2, 9, 11], P = [1, 3, 4, 5, 7, 8, 10, 11], H = [1, 3, 4, 5, 7, 8], M = l.getRootContainer, O = s([9, 11]), aa = s([5, 6, 10, 12]), $ = s([6, 10, 12]), Z = document.createElement("style"), S = !1; try { Z.innerHTML = "<b>x</b>", S = 3 == Z.firstChild.nodeType } catch (ca) { } b.features.htmlParsingConforms = S; var T = "startContainer startOffset endContainer endOffset collapsed commonAncestorContainer".split(" "), Q = 0, U = 1, ba = 2, V = 3, W = 0, X = 1, Y = 2, R = 3; D.prototype = { attachListener: function (a, b) { this._listeners[a].push(b) }, compareBoundaryPoints: function (a, b) {
    v(this);
    y(this.startContainer, b.startContainer); var c = a == V || a == Q ? "start" : "end", d = a == U || a == Q ? "start" : "end"; return l.comparePoints(this[c + "Container"], this[c + "Offset"], b[d + "Container"], b[d + "Offset"])
}, insertNode: function (a) { v(this); z(a, P); A(this.startContainer); if (l.isAncestorOf(a, this.startContainer, !0)) throw new B("HIERARCHY_REQUEST_ERR"); this.setStartBefore(g(a, this.startContainer, this.startOffset)) }, cloneContents: function () {
    v(this); var b, c; if (this.collapsed) return a(this).createDocumentFragment(); if (this.startContainer ===
this.endContainer && l.isCharacterDataNode(this.startContainer)) return b = this.startContainer.cloneNode(!0), b.data = b.data.slice(this.startOffset, this.endOffset), c = a(this).createDocumentFragment(), c.appendChild(b), c; c = new q(this, !0); b = i(c); c.detach(); return b
}, canSurroundContents: function () { v(this); A(this.startContainer); A(this.endContainer); var a = new q(this, !0), b = a._first && c(a._first, this) || a._last && c(a._last, this); a.detach(); return !b }, surroundContents: function (a) {
    z(a, H); if (!this.canSurroundContents()) throw new r("BAD_BOUNDARYPOINTS_ERR");
    var b = this.extractContents(); if (a.hasChildNodes()) for (; a.lastChild; ) a.removeChild(a.lastChild); g(a, this.startContainer, this.startOffset); a.appendChild(b); this.selectNode(a)
}, cloneRange: function () { v(this); for (var b = new C(a(this)), c = T.length, d; c--; ) d = T[c], b[d] = this[d]; return b }, toString: function () {
    v(this); var a = this.startContainer; if (a === this.endContainer && l.isCharacterDataNode(a)) return 3 == a.nodeType || 4 == a.nodeType ? a.data.slice(this.startOffset, this.endOffset) : ""; var b = [], a = new q(this, !0); h(a, function (a) {
        (3 ==
a.nodeType || 4 == a.nodeType) && b.push(a.data)
    }); a.detach(); return b.join("")
}, compareNode: function (a) { v(this); var b = a.parentNode, c = l.getNodeIndex(a); if (!b) throw new B("NOT_FOUND_ERR"); a = this.comparePoint(b, c); b = this.comparePoint(b, c + 1); return 0 > a ? 0 < b ? Y : W : 0 < b ? X : R }, comparePoint: function (a, b) { v(this); t(a, "HIERARCHY_REQUEST_ERR"); y(a, this.startContainer); return 0 > l.comparePoints(a, b, this.startContainer, this.startOffset) ? -1 : 0 < l.comparePoints(a, b, this.endContainer, this.endOffset) ? 1 : 0 }, createContextualFragment: S ?
function (a) { var b = this.startContainer, c = l.getDocument(b); if (!b) throw new B("INVALID_STATE_ERR"); var d = null; 1 == b.nodeType ? d = b : l.isCharacterDataNode(b) && (d = l.parentElement(b)); d = null === d || "HTML" == d.nodeName && l.isHtmlNamespace(l.getDocument(d).documentElement) && l.isHtmlNamespace(d) ? c.createElement("body") : d.cloneNode(!1); d.innerHTML = a; return l.fragmentFromNodeChildren(d) } : function (b) { o(this); var c = a(this).createElement("body"); c.innerHTML = b; return l.fragmentFromNodeChildren(c) }, toHtml: function () {
    v(this);
    var b = a(this).createElement("div"); b.appendChild(this.cloneContents()); return b.innerHTML
}, intersectsNode: function (b, c) { v(this); t(b, "NOT_FOUND_ERR"); if (l.getDocument(b) !== a(this)) return !1; var d = b.parentNode, h = l.getNodeIndex(b); t(d, "NOT_FOUND_ERR"); var e = l.comparePoints(d, h, this.endContainer, this.endOffset), d = l.comparePoints(d, h + 1, this.startContainer, this.startOffset); return c ? 0 >= e && 0 <= d : 0 > e && 0 < d }, isPointInRange: function (a, b) {
    v(this); t(a, "HIERARCHY_REQUEST_ERR"); y(a, this.startContainer); return 0 <=
l.comparePoints(a, b, this.startContainer, this.startOffset) && 0 >= l.comparePoints(a, b, this.endContainer, this.endOffset)
}, intersectsRange: function (b, c) { v(this); if (a(b) != a(this)) throw new B("WRONG_DOCUMENT_ERR"); var d = l.comparePoints(this.startContainer, this.startOffset, b.endContainer, b.endOffset), h = l.comparePoints(this.endContainer, this.endOffset, b.startContainer, b.startOffset); return c ? 0 >= d && 0 <= h : 0 > d && 0 < h }, intersection: function (a) {
    if (this.intersectsRange(a)) {
        var b = l.comparePoints(this.startContainer,
this.startOffset, a.startContainer, a.startOffset), c = l.comparePoints(this.endContainer, this.endOffset, a.endContainer, a.endOffset), d = this.cloneRange(); -1 == b && d.setStart(a.startContainer, a.startOffset); 1 == c && d.setEnd(a.endContainer, a.endOffset); return d
    } return null
}, union: function (a) {
    if (this.intersectsRange(a, !0)) {
        var b = this.cloneRange(); -1 == l.comparePoints(a.startContainer, a.startOffset, this.startContainer, this.startOffset) && b.setStart(a.startContainer, a.startOffset); 1 == l.comparePoints(a.endContainer,
a.endOffset, this.endContainer, this.endOffset) && b.setEnd(a.endContainer, a.endOffset); return b
    } throw new r("Ranges do not intersect");
}, containsNode: function (a, b) { return b ? this.intersectsNode(a, !1) : this.compareNode(a) == R }, containsNodeContents: function (a) { return 0 <= this.comparePoint(a, 0) && 0 >= this.comparePoint(a, l.getNodeLength(a)) }, containsRange: function (a) { return this.intersection(a).equals(a) }, containsNodeText: function (a) {
    var b = this.cloneRange(); b.selectNode(a); var c = b.getNodes([3]); return 0 < c.length ?
(b.setStart(c[0], 0), a = c.pop(), b.setEnd(a, a.length), a = this.containsRange(b), b.detach(), a) : this.containsNodeContents(a)
}, createNodeIterator: function (a, b) { v(this); return new m(this, a, b) }, getNodes: function (a, b) { v(this); return n(this, a, b) }, getDocument: function () { return a(this) }, collapseBefore: function (a) { o(this); this.setEndBefore(a); this.collapse(!1) }, collapseAfter: function (a) { o(this); this.setStartAfter(a); this.collapse(!0) }, getName: function () { return "DomRange" }, equals: function (a) {
    return C.rangesEqual(this,
a)
}, inspect: function () { return p(this) } 
}; I(C, J, function (a) { o(a); a.startContainer = a.startOffset = a.endContainer = a.endOffset = null; a.collapsed = a.commonAncestorContainer = null; d(a, "detach", null); a._listeners = null }); b.rangePrototype = D.prototype; C.rangeProperties = T; C.RangeIterator = q; C.copyComparisonConstants = F; C.createPrototypeRange = I; C.inspect = p; C.getRangeDocument = a; C.rangesEqual = function (a, b) {
    return a.startContainer === b.startContainer && a.startOffset === b.startOffset && a.endContainer === b.endContainer && a.endOffset ===
b.endOffset
}; b.DomRange = C; b.RangeException = r
});
rangy.createModule("WrappedRange", function (b) {
    function c(a, b, c, d) {
        var g = a.duplicate(); g.collapse(c); var i = g.parentElement(); e.isAncestorOf(b, i, !0) || (i = b); if (!i.canHaveHTML) return new f(i.parentNode, e.getNodeIndex(i)); var b = e.getDocument(i).createElement("span"), r, m = c ? "StartToStart" : "StartToEnd"; do i.insertBefore(b, b.previousSibling), g.moveToElementText(b); while (0 < (r = g.compareEndPoints(m, a)) && b.previousSibling); m = b.nextSibling; if (-1 == r && m && e.isCharacterDataNode(m)) {
            g.setEndPoint(c ? "EndToStart" : "EndToEnd",
a); if (/[\r\n]/.test(m.data)) { i = g.duplicate(); c = i.text.replace(/\r\n/g, "\r").length; for (c = i.moveStart("character", c); -1 == i.compareEndPoints("StartToEnd", i); ) c++, i.moveStart("character", 1) } else c = g.text.length; i = new f(m, c)
        } else m = (d || !c) && b.previousSibling, i = (c = (d || c) && b.nextSibling) && e.isCharacterDataNode(c) ? new f(c, 0) : m && e.isCharacterDataNode(m) ? new f(m, m.length) : new f(i, e.getNodeIndex(b)); b.parentNode.removeChild(b); return i
    } function a(a, b) {
        var c, d, f = a.offset, g = e.getDocument(a.node), i = g.body.createTextRange(),
m = e.isCharacterDataNode(a.node); m ? (c = a.node, d = c.parentNode) : (c = a.node.childNodes, c = f < c.length ? c[f] : null, d = a.node); g = g.createElement("span"); g.innerHTML = "&#feff;"; c ? d.insertBefore(g, c) : d.appendChild(g); i.moveToElementText(g); i.collapse(!b); d.removeChild(g); if (m) i[b ? "moveStart" : "moveEnd"]("character", f); return i
    } b.requireModules(["DomUtil", "DomRange"]); var d, e = b.dom, f = e.DomPosition, g = b.DomRange; if (b.features.implementsDomRange && (!b.features.implementsTextRange || !b.config.preferTextRange)) (function () {
        function a(b) {
            for (var c =
j.length, d; c--; ) d = j[c], b[d] = b.nativeRange[d]
        } var c, j = g.rangeProperties, f; d = function (b) { if (!b) throw Error("Range must be specified"); this.nativeRange = b; a(this) }; g.createPrototypeRange(d, function (a, b, c, d, h) { var e = a.endContainer !== d || a.endOffset != h; if (a.startContainer !== b || a.startOffset != c || e) a.setEnd(d, h), a.setStart(b, c) }, function (a) { a.nativeRange.detach(); a.detached = !0; for (var b = j.length, c; b--; ) c = j[b], a[c] = null }); c = d.prototype; c.selectNode = function (b) { this.nativeRange.selectNode(b); a(this) }; c.deleteContents =
function () { this.nativeRange.deleteContents(); a(this) }; c.extractContents = function () { var b = this.nativeRange.extractContents(); a(this); return b }; c.cloneContents = function () { return this.nativeRange.cloneContents() }; c.surroundContents = function (b) { this.nativeRange.surroundContents(b); a(this) }; c.collapse = function (b) { this.nativeRange.collapse(b); a(this) }; c.cloneRange = function () { return new d(this.nativeRange.cloneRange()) }; c.refresh = function () { a(this) }; c.toString = function () { return this.nativeRange.toString() };
        var i = document.createTextNode("test"); e.getBody(document).appendChild(i); var q = document.createRange(); q.setStart(i, 0); q.setEnd(i, 0); try { q.setStart(i, 1), c.setStart = function (b, c) { this.nativeRange.setStart(b, c); a(this) }, c.setEnd = function (b, c) { this.nativeRange.setEnd(b, c); a(this) }, f = function (b) { return function (c) { this.nativeRange[b](c); a(this) } } } catch (r) {
            c.setStart = function (b, c) { try { this.nativeRange.setStart(b, c) } catch (d) { this.nativeRange.setEnd(b, c), this.nativeRange.setStart(b, c) } a(this) }, c.setEnd = function (b,
c) { try { this.nativeRange.setEnd(b, c) } catch (d) { this.nativeRange.setStart(b, c), this.nativeRange.setEnd(b, c) } a(this) }, f = function (b, c) { return function (d) { try { this.nativeRange[b](d) } catch (e) { this.nativeRange[c](d), this.nativeRange[b](d) } a(this) } } 
        } c.setStartBefore = f("setStartBefore", "setEndBefore"); c.setStartAfter = f("setStartAfter", "setEndAfter"); c.setEndBefore = f("setEndBefore", "setStartBefore"); c.setEndAfter = f("setEndAfter", "setStartAfter"); q.selectNodeContents(i); c.selectNodeContents = q.startContainer ==
i && q.endContainer == i && 0 == q.startOffset && q.endOffset == i.length ? function (b) { this.nativeRange.selectNodeContents(b); a(this) } : function (a) { this.setStart(a, 0); this.setEnd(a, g.getEndOffset(a)) }; q.selectNodeContents(i); q.setEnd(i, 3); f = document.createRange(); f.selectNodeContents(i); f.setEnd(i, 4); f.setStart(i, 2); c.compareBoundaryPoints = -1 == q.compareBoundaryPoints(q.START_TO_END, f) & 1 == q.compareBoundaryPoints(q.END_TO_START, f) ? function (a, b) {
    b = b.nativeRange || b; a == b.START_TO_END ? a = b.END_TO_START : a == b.END_TO_START &&
(a = b.START_TO_END); return this.nativeRange.compareBoundaryPoints(a, b)
} : function (a, b) { return this.nativeRange.compareBoundaryPoints(a, b.nativeRange || b) }; b.util.isHostMethod(q, "createContextualFragment") && (c.createContextualFragment = function (a) { return this.nativeRange.createContextualFragment(a) }); e.getBody(document).removeChild(i); q.detach(); f.detach()
    })(), b.createNativeRange = function (a) { a = a || document; return a.createRange() }; else if (b.features.implementsTextRange) {
        d = function (a) { this.textRange = a; this.refresh() };
        d.prototype = new g(document); d.prototype.refresh = function () { var a, b, d = this.textRange; a = d.parentElement(); var f = d.duplicate(); f.collapse(!0); b = f.parentElement(); f = d.duplicate(); f.collapse(!1); d = f.parentElement(); b = b == d ? b : e.getCommonAncestor(b, d); b = b == a ? b : e.getCommonAncestor(a, b); 0 == this.textRange.compareEndPoints("StartToEnd", this.textRange) ? b = a = c(this.textRange, b, !0, !0) : (a = c(this.textRange, b, !0, !1), b = c(this.textRange, b, !1, !1)); this.setStart(a.node, a.offset); this.setEnd(b.node, b.offset) }; g.copyComparisonConstants(d);
        var i = function () { return this } (); "undefined" == typeof i.Range && (i.Range = d); b.createNativeRange = function (a) { a = a || document; return a.body.createTextRange() } 
    } b.features.implementsTextRange && (d.rangeToTextRange = function (b) { if (b.collapsed) return a(new f(b.startContainer, b.startOffset), !0); var c = a(new f(b.startContainer, b.startOffset), !0), d = a(new f(b.endContainer, b.endOffset), !1), b = e.getDocument(b.startContainer).body.createTextRange(); b.setEndPoint("StartToStart", c); b.setEndPoint("EndToEnd", d); return b });
    d.prototype.getName = function () { return "WrappedRange" }; b.WrappedRange = d; b.createRange = function (a) { a = a || document; return new d(b.createNativeRange(a)) }; b.createRangyRange = function (a) { a = a || document; return new g(a) }; b.createIframeRange = function (a) { return b.createRange(e.getIframeDocument(a)) }; b.createIframeRangyRange = function (a) { return b.createRangyRange(e.getIframeDocument(a)) }; b.addCreateMissingNativeApiListener(function (a) {
        a = a.document; if (typeof a.createRange == "undefined") a.createRange = function () { return b.createRange(this) };
        a = a = null
    })
});
rangy.createModule("WrappedSelection", function (b, c) {
    function a(a) { return (a || window).getSelection() } function d(a) { return (a || window).document.selection } function e(a, b, c) { var d = c ? "end" : "start", c = c ? "start" : "end"; a.anchorNode = b[d + "Container"]; a.anchorOffset = b[d + "Offset"]; a.focusNode = b[c + "Container"]; a.focusOffset = b[c + "Offset"] } function f(a) { a.anchorNode = a.focusNode = null; a.anchorOffset = a.focusOffset = 0; a.rangeCount = 0; a.isCollapsed = !0; a._ranges.length = 0 } function g(a) {
        var c; a instanceof x ? (c = a._selectionNativeRange,
c || (c = b.createNativeRange(m.getDocument(a.startContainer)), c.setEnd(a.endContainer, a.endOffset), c.setStart(a.startContainer, a.startOffset), a._selectionNativeRange = c, a.attachListener("detach", function () { this._selectionNativeRange = null }))) : a instanceof o ? c = a.nativeRange : b.features.implementsDomRange && a instanceof m.getWindow(a.startContainer).Range && (c = a); return c
    } function i(a) {
        var b = a.getNodes(), c; a: if (!b.length || 1 != b[0].nodeType) c = !1; else {
            c = 1; for (var d = b.length; c < d; ++c) if (!m.isAncestorOf(b[0], b[c])) {
                c =
!1; break a
            } c = !0
        } if (!c) throw Error("getSingleElementFromRange: range " + a.inspect() + " did not consist of a single element"); return b[0]
    } function h(a, b) { var c = new o(b); a._ranges = [c]; e(a, c, !1); a.rangeCount = 1; a.isCollapsed = c.collapsed } function k(a) {
        a._ranges.length = 0; if ("None" == a.docSelection.type) f(a); else {
            var c = a.docSelection.createRange(); if (c && "undefined" != typeof c.text) h(a, c); else {
                a.rangeCount = c.length; for (var d, j = m.getDocument(c.item(0)), k = 0; k < a.rangeCount; ++k) d = b.createRange(j), d.selectNode(c.item(k)),
a._ranges.push(d); a.isCollapsed = 1 == a.rangeCount && a._ranges[0].collapsed; e(a, a._ranges[a.rangeCount - 1], !1)
            } 
        } 
    } function j(a, b) { for (var c = a.docSelection.createRange(), d = i(b), e = m.getDocument(c.item(0)), e = m.getBody(e).createControlRange(), h = 0, j = c.length; h < j; ++h) e.add(c.item(h)); try { e.add(d) } catch (f) { throw Error("addRange(): Element within the specified Range could not be added to control selection (does it have layout?)"); } e.select(); k(a) } function n(a, b, c) {
        this.nativeSelection = a; this.docSelection = b; this._ranges =
[]; this.win = c; this.refresh()
    } function p(a, b) { for (var c = m.getDocument(b[0].startContainer), c = m.getBody(c).createControlRange(), d = 0, e; d < rangeCount; ++d) { e = i(b[d]); try { c.add(e) } catch (h) { throw Error("setRanges(): Element within the one of the specified Ranges could not be added to control selection (does it have layout?)"); } } c.select(); k(a) } function q(a, b) { if (a.anchorNode && m.getDocument(a.anchorNode) !== m.getDocument(b)) throw new z("WRONG_DOCUMENT_ERR"); } function r(a) {
        var b = [], c = new w(a.anchorNode, a.anchorOffset),
d = new w(a.focusNode, a.focusOffset), e = "function" == typeof a.getName ? a.getName() : "Selection"; if ("undefined" != typeof a.rangeCount) for (var h = 0, j = a.rangeCount; h < j; ++h) b[h] = x.inspect(a.getRangeAt(h)); return "[" + e + "(Ranges: " + b.join(", ") + ")(anchor: " + c.inspect() + ", focus: " + d.inspect() + "]"
    } b.requireModules(["DomUtil", "DomRange", "WrappedRange"]); b.config.checkSelectionRanges = !0; var m = b.dom, s = b.util, x = b.DomRange, o = b.WrappedRange, z = b.DOMException, w = m.DomPosition, y, A, t = b.util.isHostMethod(window, "getSelection"),
v = b.util.isHostObject(document, "selection"), D = v && (!t || b.config.preferTextRange); D ? (y = d, b.isSelectionValid = function (a) { var a = (a || window).document, b = a.selection; return "None" != b.type || m.getDocument(b.createRange().parentElement()) == a }) : t ? (y = a, b.isSelectionValid = function () { return !0 }) : c.fail("Neither document.selection or window.getSelection() detected."); b.getNativeSelection = y; var t = y(), K = b.createNativeRange(document), F = m.getBody(document), E = s.areHostObjects(t, s.areHostProperties(t, ["anchorOffset", "focusOffset"]));
    b.features.selectionHasAnchorAndFocus = E; var I = s.isHostMethod(t, "extend"); b.features.selectionHasExtend = I; var N = "number" == typeof t.rangeCount; b.features.selectionHasRangeCount = N; var J = !1, C = !0; s.areHostMethods(t, ["addRange", "getRangeAt", "removeAllRanges"]) && ("number" == typeof t.rangeCount && b.features.implementsDomRange) && function () {
        var a = document.createElement("iframe"); F.appendChild(a); var b = m.getIframeDocument(a); b.open(); b.write("<html><head></head><body>12</body></html>"); b.close(); var c = m.getIframeWindow(a).getSelection(),
d = b.documentElement.lastChild.firstChild, b = b.createRange(); b.setStart(d, 1); b.collapse(true); c.addRange(b); C = c.rangeCount == 1; c.removeAllRanges(); var e = b.cloneRange(); b.setStart(d, 0); e.setEnd(d, 2); c.addRange(b); c.addRange(e); J = c.rangeCount == 2; b.detach(); e.detach(); F.removeChild(a)
    } (); b.features.selectionSupportsMultipleRanges = J; b.features.collapsedNonEditableSelectionsSupported = C; var l = !1, u; F && s.isHostMethod(F, "createControlRange") && (u = F.createControlRange(), s.areHostProperties(u, ["item", "add"]) && (l =
!0)); b.features.implementsControlRange = l; A = E ? function (a) { return a.anchorNode === a.focusNode && a.anchorOffset === a.focusOffset } : function (a) { return a.rangeCount ? a.getRangeAt(a.rangeCount - 1).collapsed : false }; var B; s.isHostMethod(t, "getRangeAt") ? B = function (a, b) { try { return a.getRangeAt(b) } catch (c) { return null } } : E && (B = function (a) {
    var c = m.getDocument(a.anchorNode), c = b.createRange(c); c.setStart(a.anchorNode, a.anchorOffset); c.setEnd(a.focusNode, a.focusOffset); if (c.collapsed !== this.isCollapsed) {
        c.setStart(a.focusNode,
a.focusOffset); c.setEnd(a.anchorNode, a.anchorOffset)
    } return c
}); b.getSelection = function (a) { var a = a || window, b = a._rangySelection, c = y(a), e = v ? d(a) : null; if (b) { b.nativeSelection = c; b.docSelection = e; b.refresh(a) } else { b = new n(c, e, a); a._rangySelection = b } return b }; b.getIframeSelection = function (a) { return b.getSelection(m.getIframeWindow(a)) }; u = n.prototype; if (!D && E && s.areHostMethods(t, ["removeAllRanges", "addRange"])) {
        u.removeAllRanges = function () { this.nativeSelection.removeAllRanges(); f(this) }; var L = function (a,
c) { var d = x.getRangeDocument(c), d = b.createRange(d); d.collapseToPoint(c.endContainer, c.endOffset); a.nativeSelection.addRange(g(d)); a.nativeSelection.extend(c.startContainer, c.startOffset); a.refresh() }; u.addRange = N ? function (a, c) {
    if (l && v && this.docSelection.type == "Control") j(this, a); else if (c && I) L(this, a); else {
        var d; if (J) d = this.rangeCount; else { this.removeAllRanges(); d = 0 } this.nativeSelection.addRange(g(a)); this.rangeCount = this.nativeSelection.rangeCount; if (this.rangeCount == d + 1) {
            if (b.config.checkSelectionRanges) (d =
B(this.nativeSelection, this.rangeCount - 1)) && !x.rangesEqual(d, a) && (a = new o(d)); this._ranges[this.rangeCount - 1] = a; e(this, a, H(this.nativeSelection)); this.isCollapsed = A(this)
        } else this.refresh()
    } 
} : function (a, b) { if (b && I) L(this, a); else { this.nativeSelection.addRange(g(a)); this.refresh() } }; u.setRanges = function (a) { if (l && a.length > 1) p(this, a); else { this.removeAllRanges(); for (var b = 0, c = a.length; b < c; ++b) this.addRange(a[b]) } } 
    } else if (s.isHostMethod(t, "empty") && s.isHostMethod(K, "select") && l && D) u.removeAllRanges =
function () { try { this.docSelection.empty(); if (this.docSelection.type != "None") { var a; if (this.anchorNode) a = m.getDocument(this.anchorNode); else if (this.docSelection.type == "Control") { var b = this.docSelection.createRange(); b.length && (a = m.getDocument(b.item(0)).body.createTextRange()) } if (a) { a.body.createTextRange().select(); this.docSelection.empty() } } } catch (c) { } f(this) }, u.addRange = function (a) {
    if (this.docSelection.type == "Control") j(this, a); else {
        o.rangeToTextRange(a).select(); this._ranges[0] = a; this.rangeCount =
1; this.isCollapsed = this._ranges[0].collapsed; e(this, a, false)
    } 
}, u.setRanges = function (a) { this.removeAllRanges(); var b = a.length; b > 1 ? p(this, a) : b && this.addRange(a[0]) }; else return c.fail("No means of selecting a Range or TextRange was found"), !1; u.getRangeAt = function (a) { if (a < 0 || a >= this.rangeCount) throw new z("INDEX_SIZE_ERR"); return this._ranges[a] }; var G; if (D) G = function (a) {
    var c; if (b.isSelectionValid(a.win)) c = a.docSelection.createRange(); else { c = m.getBody(a.win.document).createTextRange(); c.collapse(true) } a.docSelection.type ==
"Control" ? k(a) : c && typeof c.text != "undefined" ? h(a, c) : f(a)
}; else if (s.isHostMethod(t, "getRangeAt") && "number" == typeof t.rangeCount) G = function (a) { if (l && v && a.docSelection.type == "Control") k(a); else { a._ranges.length = a.rangeCount = a.nativeSelection.rangeCount; if (a.rangeCount) { for (var c = 0, d = a.rangeCount; c < d; ++c) a._ranges[c] = new b.WrappedRange(a.nativeSelection.getRangeAt(c)); e(a, a._ranges[a.rangeCount - 1], H(a.nativeSelection)); a.isCollapsed = A(a) } else f(a) } }; else if (E && "boolean" == typeof t.isCollapsed && "boolean" ==
typeof K.collapsed && b.features.implementsDomRange) G = function (a) { var b; b = a.nativeSelection; if (b.anchorNode) { b = B(b, 0); a._ranges = [b]; a.rangeCount = 1; b = a.nativeSelection; a.anchorNode = b.anchorNode; a.anchorOffset = b.anchorOffset; a.focusNode = b.focusNode; a.focusOffset = b.focusOffset; a.isCollapsed = A(a) } else f(a) }; else return c.fail("No means of obtaining a Range or TextRange from the user's selection was found"), !1; u.refresh = function (a) {
    var b = a ? this._ranges.slice(0) : null; G(this); if (a) {
        a = b.length; if (a != this._ranges.length) return false;
        for (; a--; ) if (!x.rangesEqual(b[a], this._ranges[a])) return false; return true
    } 
}; var P = function (a, b) { var c = a.getAllRanges(), d = false; a.removeAllRanges(); for (var e = 0, h = c.length; e < h; ++e) d || b !== c[e] ? a.addRange(c[e]) : d = true; a.rangeCount || f(a) }; u.removeRange = l ? function (a) {
    if (this.docSelection.type == "Control") {
        for (var b = this.docSelection.createRange(), a = i(a), c = m.getDocument(b.item(0)), c = m.getBody(c).createControlRange(), d, e = false, h = 0, j = b.length; h < j; ++h) { d = b.item(h); d !== a || e ? c.add(b.item(h)) : e = true } c.select();
        k(this)
    } else P(this, a)
} : function (a) { P(this, a) }; var H; !D && E && b.features.implementsDomRange ? (H = function (a) { var b = false; a.anchorNode && (b = m.comparePoints(a.anchorNode, a.anchorOffset, a.focusNode, a.focusOffset) == 1); return b }, u.isBackwards = function () { return H(this) }) : H = u.isBackwards = function () { return false }; u.toString = function () { for (var a = [], b = 0, c = this.rangeCount; b < c; ++b) a[b] = "" + this._ranges[b]; return a.join("") }; u.collapse = function (a, c) {
    q(this, a); var d = b.createRange(m.getDocument(a)); d.collapseToPoint(a,
c); this.removeAllRanges(); this.addRange(d); this.isCollapsed = true
}; u.collapseToStart = function () { if (this.rangeCount) { var a = this._ranges[0]; this.collapse(a.startContainer, a.startOffset) } else throw new z("INVALID_STATE_ERR"); }; u.collapseToEnd = function () { if (this.rangeCount) { var a = this._ranges[this.rangeCount - 1]; this.collapse(a.endContainer, a.endOffset) } else throw new z("INVALID_STATE_ERR"); }; u.selectAllChildren = function (a) {
    q(this, a); var c = b.createRange(m.getDocument(a)); c.selectNodeContents(a); this.removeAllRanges();
    this.addRange(c)
}; u.deleteFromDocument = function () { if (l && v && this.docSelection.type == "Control") { for (var a = this.docSelection.createRange(), b; a.length; ) { b = a.item(0); a.remove(b); b.parentNode.removeChild(b) } this.refresh() } else if (this.rangeCount) { a = this.getAllRanges(); this.removeAllRanges(); b = 0; for (var c = a.length; b < c; ++b) a[b].deleteContents(); this.addRange(a[c - 1]) } }; u.getAllRanges = function () { return this._ranges.slice(0) }; u.setSingleRange = function (a) { this.setRanges([a]) }; u.containsNode = function (a, b) {
    for (var c =
0, d = this._ranges.length; c < d; ++c) if (this._ranges[c].containsNode(a, b)) return true; return false
}; u.toHtml = function () { var a = ""; if (this.rangeCount) { for (var a = x.getRangeDocument(this._ranges[0]).createElement("div"), b = 0, c = this._ranges.length; b < c; ++b) a.appendChild(this._ranges[b].cloneContents()); a = a.innerHTML } return a }; u.getName = function () { return "WrappedSelection" }; u.inspect = function () { return r(this) }; u.detach = function () { this.win = this.anchorNode = this.focusNode = this.win._rangySelection = null }; n.inspect =
r; b.Selection = n; b.selectionPrototype = u; b.addCreateMissingNativeApiListener(function (a) { if (typeof a.getSelection == "undefined") a.getSelection = function () { return b.getSelection(this) }; a = null })
}); var Base = function () { };
Base.extend = function (b, c) {
    var a = Base.prototype.extend; Base._prototyping = !0; var d = new this; a.call(d, b); d.base = function () { }; delete Base._prototyping; var e = d.constructor, f = d.constructor = function () { if (!Base._prototyping) if (this._constructing || this.constructor == f) this._constructing = !0, e.apply(this, arguments), delete this._constructing; else if (null != arguments[0]) return (arguments[0].extend || a).call(arguments[0], d) }; f.ancestor = this; f.extend = this.extend; f.forEach = this.forEach; f.implement = this.implement; f.prototype =
d; f.toString = this.toString; f.valueOf = function (a) { return "object" == a ? f : e.valueOf() }; a.call(f, c); "function" == typeof f.init && f.init(); return f
};
Base.prototype = { extend: function (b, c) {
    if (1 < arguments.length) { var a = this[b]; if (a && "function" == typeof c && (!a.valueOf || a.valueOf() != c.valueOf()) && /\bbase\b/.test(c)) { var d = c.valueOf(), c = function () { var b = this.base || Base.prototype.base; this.base = a; var c = d.apply(this, arguments); this.base = b; return c }; c.valueOf = function (a) { return "object" == a ? c : d }; c.toString = Base.toString } this[b] = c } else if (b) {
        var e = Base.prototype.extend; !Base._prototyping && "function" != typeof this && (e = this.extend || e); for (var f = { toSource: null },
g = ["constructor", "toString", "valueOf"], i = Base._prototyping ? 0 : 1; h = g[i++]; ) b[h] != f[h] && e.call(this, h, b[h]); for (var h in b) f[h] || e.call(this, h, b[h])
    } return this
} 
};
Base = Base.extend({ constructor: function (b) { this.extend(b) } }, { ancestor: Object, version: "1.1", forEach: function (b, c, a) { for (var d in b) void 0 === this.prototype[d] && c.call(a, b[d], d, b) }, implement: function () { for (var b = 0; b < arguments.length; b++) if ("function" == typeof arguments[b]) arguments[b](this.prototype); else this.prototype.extend(arguments[b]); return this }, toString: function () { return "" + this.valueOf() } });
wysihtml5.browser = function () {
    var b = navigator.userAgent, c = document.createElement("div"), a = -1 !== b.indexOf("MSIE") && -1 === b.indexOf("Opera"), d = -1 !== b.indexOf("Gecko") && -1 === b.indexOf("KHTML"), e = -1 !== b.indexOf("AppleWebKit/"), f = -1 !== b.indexOf("Chrome/"), g = -1 !== b.indexOf("Opera/"); return { USER_AGENT: b, supported: function () {
        var a = this.USER_AGENT.toLowerCase(), b = "contentEditable" in c, d = document.execCommand && document.queryCommandSupported && document.queryCommandState, e = document.querySelector && document.querySelectorAll,
a = this.isIos() && 5 > (/ipad|iphone|ipod/.test(a) && a.match(/ os (\d+).+? like mac os x/) || [, 0])[1] || -1 !== a.indexOf("opera mobi") || -1 !== a.indexOf("hpwos/"); return b && d && e && !a
    }, isTouchDevice: function () { return this.supportsEvent("touchmove") }, isIos: function () { var a = this.USER_AGENT.toLowerCase(); return -1 !== a.indexOf("webkit") && -1 !== a.indexOf("mobile") }, supportsSandboxedIframes: function () { return a }, throwsMixedContentWarningWhenIframeSrcIsEmpty: function () { return !("querySelector" in document) }, displaysCaretInEmptyContentEditableCorrectly: function () { return !d },
        hasCurrentStyleProperty: function () { return "currentStyle" in c }, insertsLineBreaksOnReturn: function () { return d }, supportsPlaceholderAttributeOn: function (a) { return "placeholder" in a }, supportsEvent: function (a) { var b; if (!(b = "on" + a in c)) c.setAttribute("on" + a, "return;"), b = "function" === typeof c["on" + a]; return b }, supportsEventsInIframeCorrectly: function () { return !g }, firesOnDropOnlyWhenOnDragOverIsCancelled: function () { return e || d }, supportsDataTransfer: function () { try { return e && (window.Clipboard || window.DataTransfer).prototype.getData } catch (a) { return !1 } },
        supportsHTML5Tags: function (a) { a = a.createElement("div"); a.innerHTML = "<article>foo</article>"; return "<article>foo</article>" === a.innerHTML.toLowerCase() }, supportsCommand: function () { var b = { formatBlock: a, insertUnorderedList: a || g || e, insertOrderedList: a || g || e }, c = { insertHTML: d }; return function (a, d) { if (!b[d]) { try { return a.queryCommandSupported(d) } catch (e) { } try { return a.queryCommandEnabled(d) } catch (f) { return !!c[d] } } return !1 } } (), doesAutoLinkingInContentEditable: function () { return a }, canDisableAutoLinking: function () {
            return this.supportsCommand(document,
"AutoUrlDetect")
        }, clearsContentEditableCorrectly: function () { return d || g || e }, supportsGetAttributeCorrectly: function () { return "1" != document.createElement("td").getAttribute("rowspan") }, canSelectImagesInContentEditable: function () { return d || a || g }, clearsListsInContentEditableCorrectly: function () { return d || a || e }, autoScrollsToCaret: function () { return !e }, autoClosesUnclosedTags: function () {
            var a = c.cloneNode(!1), b; a.innerHTML = "<p><div></div>"; a = a.innerHTML.toLowerCase(); b = "<p></p><div></div>" === a || "<p><div></div></p>" ===
a; this.autoClosesUnclosedTags = function () { return b }; return b
        }, supportsNativeGetElementsByClassName: function () { return -1 !== ("" + document.getElementsByClassName).indexOf("[native code]") }, supportsSelectionModify: function () { return "getSelection" in window && "modify" in window.getSelection() }, supportsClassList: function () { return "classList" in c }, needsSpaceAfterLineBreak: function () { return g }, supportsSpeechApiOn: function (a) { return 11 <= (b.match(/Chrome\/(\d+)/) || [, 0])[1] && ("onwebkitspeechchange" in a || "speech" in a) },
        crashesWhenDefineProperty: function (b) { return a && ("XMLHttpRequest" === b || "XDomainRequest" === b) }, doesAsyncFocus: function () { return a }, hasProblemsSettingCaretAfterImg: function () { return a }, hasUndoInContextMenu: function () { return d || f || g } 
    }
} ();
wysihtml5.lang.array = function (b) { return { contains: function (c) { if (b.indexOf) return -1 !== b.indexOf(c); for (var a = 0, d = b.length; a < d; a++) if (b[a] === c) return !0; return !1 }, without: function (c) { for (var c = wysihtml5.lang.array(c), a = [], d = 0, e = b.length; d < e; d++) c.contains(b[d]) || a.push(b[d]); return a }, get: function () { for (var c = 0, a = b.length, d = []; c < a; c++) d.push(b[c]); return d } } };
wysihtml5.lang.Dispatcher = Base.extend({ observe: function (b, c) { this.events = this.events || {}; this.events[b] = this.events[b] || []; this.events[b].push(c); return this }, on: function () { return this.observe.apply(this, wysihtml5.lang.array(arguments).get()) }, fire: function (b, c) { this.events = this.events || {}; for (var a = this.events[b] || [], d = 0; d < a.length; d++) a[d].call(this, c); return this }, stopObserving: function (b, c) {
    this.events = this.events || {}; var a = 0, d, e; if (b) {
        d = this.events[b] || []; for (e = []; a < d.length; a++) d[a] !== c && c &&
e.push(d[a]); this.events[b] = e
    } else this.events = {}; return this
} 
}); wysihtml5.lang.object = function (b) { return { merge: function (c) { for (var a in c) b[a] = c[a]; return this }, get: function () { return b }, clone: function () { var c = {}, a; for (a in b) c[a] = b[a]; return c }, isArray: function () { return "[object Array]" === Object.prototype.toString.call(b) } } };
(function () { var b = /^\s+/, c = /\s+$/; wysihtml5.lang.string = function (a) { a = "" + a; return { trim: function () { return a.replace(b, "").replace(c, "") }, interpolate: function (b) { for (var c in b) a = this.replace("#{" + c + "}").by(b[c]); return a }, replace: function (b) { return { by: function (c) { return a.split(b).join(c) } } } } } })();
(function (b) {
    function c(a) { return a.replace(e, function (a, b) { var c = (b.match(f) || [])[1] || "", d = i[c], b = b.replace(f, ""); b.split(d).length > b.split(c).length && (b += c, c = ""); var e = d = b; b.length > g && (e = e.substr(0, g) + "..."); "www." === d.substr(0, 4) && (d = "http://" + d); return '<a href="' + d + '">' + e + "</a>" + c }) } function a(h) {
        if (!d.contains(h.nodeName)) if (h.nodeType === b.TEXT_NODE && h.data.match(e)) {
            var f = h.parentNode, j; j = f.ownerDocument; var g = j._wysihtml5_tempElement; g || (g = j._wysihtml5_tempElement = j.createElement("div")); j =
g; j.innerHTML = "<span></span>" + c(h.data); for (j.removeChild(j.firstChild); j.firstChild; ) f.insertBefore(j.firstChild, h); f.removeChild(h)
        } else { f = b.lang.array(h.childNodes).get(); j = f.length; for (g = 0; g < j; g++) a(f[g]); return h } 
    } var d = b.lang.array("CODE PRE A SCRIPT HEAD TITLE STYLE".split(" ")), e = /((https?:\/\/|www\.)[^\s<]{3,})/gi, f = /([^\w\/\-](,?))$/i, g = 100, i = { ")": "(", "]": "[", "}": "{" }; b.dom.autoLink = function (b) {
        var c; a: 
        {
            c = b; for (var e; c.parentNode; ) {
                c = c.parentNode; e = c.nodeName; if (d.contains(e)) { c = !0; break a } if ("body" ===
e) break
            } c = !1
        } if (c) return b; b === b.ownerDocument.documentElement && (b = b.ownerDocument.body); return a(b)
    }; b.dom.autoLink.URL_REG_EXP = e
})(wysihtml5);
(function (b) { var c = b.browser.supportsClassList(), a = b.dom; a.addClass = function (b, e) { if (c) return b.classList.add(e); a.hasClass(b, e) || (b.className += " " + e) }; a.removeClass = function (a, b) { if (c) return a.classList.remove(b); a.className = a.className.replace(RegExp("(^|\\s+)" + b + "(\\s+|$)"), " ") }; a.hasClass = function (a, b) { if (c) return a.classList.contains(b); var f = a.className; return 0 < f.length && (f == b || RegExp("(^|\\s)" + b + "(\\s|$)").test(f)) } })(wysihtml5);
wysihtml5.dom.contains = function () { var b = document.documentElement; if (b.contains) return function (b, a) { a.nodeType !== wysihtml5.ELEMENT_NODE && (a = a.parentNode); return b !== a && b.contains(a) }; if (b.compareDocumentPosition) return function (b, a) { return !!(b.compareDocumentPosition(a) & 16) } } ();
wysihtml5.dom.convertToList = function () {
    function b(b, a) { var d = b.createElement("li"); a.appendChild(d); return d } return function (c, a) {
        if ("UL" === c.nodeName || "OL" === c.nodeName || "MENU" === c.nodeName) return c; var d = c.ownerDocument, e = d.createElement(a), f = c.querySelectorAll("br"), g = f.length, i, h, k, j, n; for (n = 0; n < g; n++) for (i = f[n]; (h = i.parentNode) && h !== c && h.lastChild === i; ) { if ("block" === wysihtml5.dom.getStyle("display").from(h)) { h.removeChild(i); break } wysihtml5.dom.insert(i).after(i.parentNode) } f = wysihtml5.lang.array(c.childNodes).get();
        g = f.length; for (n = 0; n < g; n++) j = j || b(d, e), i = f[n], h = "block" === wysihtml5.dom.getStyle("display").from(i), k = "BR" === i.nodeName, h ? (j = j.firstChild ? b(d, e) : j, j.appendChild(i), j = null) : k ? j = j.firstChild ? null : j : j.appendChild(i); c.parentNode.replaceChild(e, c); return e
    } 
} (); wysihtml5.dom.copyAttributes = function (b) { return { from: function (c) { return { to: function (a) { for (var d, e = 0, f = b.length; e < f; e++) d = b[e], "undefined" !== typeof c[d] && "" !== c[d] && (a[d] = c[d]); return { andTo: arguments.callee} } } } } };
(function (b) { var c = ["-webkit-box-sizing", "-moz-box-sizing", "-ms-box-sizing", "box-sizing"], a = function (a) { var e; a: for (var f = 0, g = c.length; f < g; f++) if ("border-box" === b.getStyle(c[f]).from(a)) { e = c[f]; break a } return e ? parseInt(b.getStyle("width").from(a), 10) < a.offsetWidth : !1 }; b.copyStyles = function (d) { return { from: function (e) { a(e) && (d = wysihtml5.lang.array(d).without(c)); for (var f = "", g = d.length, i = 0, h; i < g; i++) h = d[i], f += h + ":" + b.getStyle(h).from(e) + ";"; return { to: function (a) { b.setStyles(f).on(a); return { andTo: arguments.callee} } } } } } })(wysihtml5.dom);
(function (b) { b.dom.delegate = function (c, a, d, e) { return b.dom.observe(c, d, function (d) { for (var g = d.target, i = b.lang.array(c.querySelectorAll(a)); g && g !== c; ) { if (i.contains(g)) { e.call(g, d); break } g = g.parentNode } }) } })(wysihtml5);
wysihtml5.dom.getAsDom = function () {
    var b = "abbr article aside audio bdi canvas command datalist details figcaption figure footer header hgroup keygen mark meter nav output progress rp rt ruby svg section source summary time track video wbr".split(" "); return function (c, a) {
        var a = a || document, d; if ("object" === typeof c && c.nodeType) d = a.createElement("div"), d.appendChild(c); else if (wysihtml5.browser.supportsHTML5Tags(a)) d = a.createElement("div"), d.innerHTML = c; else {
            d = a; if (!d._wysihtml5_supportsHTML5Tags) {
                for (var e =
0, f = b.length; e < f; e++) d.createElement(b[e]); d._wysihtml5_supportsHTML5Tags = !0
            } d = a; e = d.createElement("div"); e.style.display = "none"; d.body.appendChild(e); try { e.innerHTML = c } catch (g) { } d.body.removeChild(e); d = e
        } return d
    } 
} ();
wysihtml5.dom.getParentElement = function () {
    function b(b, a) { return !a || !a.length ? !0 : "string" === typeof a ? b === a : wysihtml5.lang.array(a).contains(b) } return function (c, a, d) {
        d = d || 50; if (a.className || a.classRegExp) { a: { for (var e = a.nodeName, f = a.className, a = a.classRegExp; d-- && c && "BODY" !== c.nodeName; ) { var g; if (g = c.nodeType === wysihtml5.ELEMENT_NODE) if (g = b(c.nodeName, e)) { g = f; var i = (c.className || "").match(a) || []; g = !g ? !!i.length : i[i.length - 1] === g } if (g) break a; c = c.parentNode } c = null } return c } a: 
        {
            e = a.nodeName; for (f = d; f-- &&
c && "BODY" !== c.nodeName; ) { if (b(c.nodeName, e)) break a; c = c.parentNode } c = null
        } return c
    } 
} ();
wysihtml5.dom.getStyle = function () {
    function b(b) { return b.replace(a, function (a) { return a.charAt(1).toUpperCase() }) } var c = { "float": "styleFloat" in document.createElement("div").style ? "styleFloat" : "cssFloat" }, a = /\-[a-z]/g; return function (a) {
        return { from: function (e) {
            if (e.nodeType === wysihtml5.ELEMENT_NODE) {
                var f = e.ownerDocument, g = c[a] || b(a), i = e.style, h = e.currentStyle, k = i[g]; if (k) return k; if (h) try { return h[g] } catch (j) { } var g = f.defaultView || f.parentWindow, f = ("height" === a || "width" === a) && "TEXTAREA" === e.nodeName,
n; if (g.getComputedStyle) return f && (n = i.overflow, i.overflow = "hidden"), e = g.getComputedStyle(e, null).getPropertyValue(a), f && (i.overflow = n || ""), e
            } 
        } 
        }
    } 
} (); wysihtml5.dom.hasElementWithTagName = function () { var b = {}, c = 1; return function (a, d) { var e = (a._wysihtml5_identifier || (a._wysihtml5_identifier = c++)) + ":" + d, f = b[e]; f || (f = b[e] = a.getElementsByTagName(d)); return 0 < f.length } } ();
(function (b) { var c = {}, a = 1; b.dom.hasElementWithClassName = function (d, e) { if (!b.browser.supportsNativeGetElementsByClassName()) return !!d.querySelector("." + e); var f = (d._wysihtml5_identifier || (d._wysihtml5_identifier = a++)) + ":" + e, g = c[f]; g || (g = c[f] = d.getElementsByClassName(e)); return 0 < g.length } })(wysihtml5); wysihtml5.dom.insert = function (b) { return { after: function (c) { c.parentNode.insertBefore(b, c.nextSibling) }, before: function (c) { c.parentNode.insertBefore(b, c) }, into: function (c) { c.appendChild(b) } } };
wysihtml5.dom.insertCSS = function (b) { b = b.join("\n"); return { into: function (c) { var a = c.head || c.getElementsByTagName("head")[0], d = c.createElement("style"); d.type = "text/css"; d.styleSheet ? d.styleSheet.cssText = b : d.appendChild(c.createTextNode(b)); a && a.appendChild(d) } } };
wysihtml5.dom.observe = function (b, c, a) {
    for (var c = "string" === typeof c ? [c] : c, d, e, f = 0, g = c.length; f < g; f++) e = c[f], b.addEventListener ? b.addEventListener(e, a, !1) : (d = function (c) { "target" in c || (c.target = c.srcElement); c.preventDefault = c.preventDefault || function () { this.returnValue = false }; c.stopPropagation = c.stopPropagation || function () { this.cancelBubble = true }; a.call(b, c) }, b.attachEvent("on" + e, d)); return { stop: function () {
        for (var e, h = 0, f = c.length; h < f; h++) e = c[h], b.removeEventListener ? b.removeEventListener(e, a, !1) :
b.detachEvent("on" + e, d)
    } 
    }
};
wysihtml5.dom.parse = function () {
    function b(c, e) { var h = c.childNodes, f = h.length, g; g = a[c.nodeType]; var k = 0; g = g && g(c); if (!g) return null; for (k = 0; k < f; k++) (newChild = b(h[k], e)) && g.appendChild(newChild); return e && 1 >= g.childNodes.length && g.nodeName.toLowerCase() === d && !g.attributes.length ? g.firstChild : g } function c(a, b) {
        var b = b.toLowerCase(), c; if (c = "IMG" == a.nodeName) if (c = "src" == b) { var d; try { d = a.complete && !a.mozMatchesSelector(":-moz-broken") } catch (e) { a.complete && "complete" === a.readyState && (d = !0) } c = !0 === d } return c ?
a.src : i && "outerHTML" in a ? -1 != a.outerHTML.toLowerCase().indexOf(" " + b + "=") ? a.getAttribute(b) : null : a.getAttribute(b)
    } var a = { 1: function (a) {
        var b, f, i = g.tags; f = a.nodeName.toLowerCase(); b = a.scopeName; if (a._wysihtml5) return null; a._wysihtml5 = 1; if ("wysihtml5-temp" === a.className) return null; b && "HTML" != b && (f = b + ":" + f); "outerHTML" in a && !wysihtml5.browser.autoClosesUnclosedTags() && ("P" === a.nodeName && "</p>" !== a.outerHTML.slice(-4).toLowerCase()) && (f = "div"); if (f in i) {
            b = i[f]; if (!b || b.remove) return null; b = "string" ===
typeof b ? { rename_tag: b} : b
        } else if (a.firstChild) b = { rename_tag: d }; else return null; f = a.ownerDocument.createElement(b.rename_tag || f); var i = {}, r = b.set_class, m = b.add_class, s = b.set_attributes, x = b.check_attributes, o = g.classes, z = 0, w = []; b = []; var y = [], A = [], t; s && (i = wysihtml5.lang.object(s).clone()); if (x) for (t in x) if (s = h[x[t]]) s = s(c(a, t)), "string" === typeof s && (i[t] = s); r && w.push(r); if (m) for (t in m) if (s = k[m[t]]) r = s(c(a, t)), "string" === typeof r && w.push(r); o["_wysihtml5-temp-placeholder"] = 1; (A = a.getAttribute("class")) &&
(w = w.concat(A.split(e))); for (m = w.length; z < m; z++) a = w[z], o[a] && b.push(a); for (o = b.length; o--; ) a = b[o], wysihtml5.lang.array(y).contains(a) || y.unshift(a); y.length && (i["class"] = y.join(" ")); for (t in i) try { f.setAttribute(t, i[t]) } catch (v) { } i.src && ("undefined" !== typeof i.width && f.setAttribute("width", i.width), "undefined" !== typeof i.height && f.setAttribute("height", i.height)); return f
    }, 3: function (a) { return a.ownerDocument.createTextNode(a.data) } 
    }, d = "span", e = /\s+/, f = { tags: {}, classes: {} }, g = {}, i = !wysihtml5.browser.supportsGetAttributeCorrectly(),
h = { url: function () { var a = /^https?:\/\//i; return function (b) { return !b || !b.match(a) ? null : b.replace(a, function (a) { return a.toLowerCase() }) } } (), alt: function () { var a = /[^ a-z0-9_\-]/gi; return function (b) { return !b ? "" : b.replace(a, "") } } (), numbers: function () { var a = /\D/g; return function (b) { return (b = (b || "").replace(a, "")) || null } } () }, k = { align_img: function () { var a = { left: "wysiwyg-float-left", right: "wysiwyg-float-right" }; return function (b) { return a[("" + b).toLowerCase()] } } (), align_text: function () {
    var a = { left: "wysiwyg-text-align-left",
        right: "wysiwyg-text-align-right", center: "wysiwyg-text-align-center", justify: "wysiwyg-text-align-justify"
    }; return function (b) { return a[("" + b).toLowerCase()] } 
} (), clear_br: function () { var a = { left: "wysiwyg-clear-left", right: "wysiwyg-clear-right", both: "wysiwyg-clear-both", all: "wysiwyg-clear-both" }; return function (b) { return a[("" + b).toLowerCase()] } } (), size_font: function () {
    var a = { 1: "wysiwyg-font-size-xx-small", 2: "wysiwyg-font-size-small", 3: "wysiwyg-font-size-medium", 4: "wysiwyg-font-size-large", 5: "wysiwyg-font-size-x-large",
        6: "wysiwyg-font-size-xx-large", 7: "wysiwyg-font-size-xx-large", "-": "wysiwyg-font-size-smaller", "+": "wysiwyg-font-size-larger"
    }; return function (b) { return a[("" + b).charAt(0)] } 
} ()
}; return function (a, c, d, e) {
    wysihtml5.lang.object(g).merge(f).merge(c).get(); for (var d = d || a.ownerDocument || document, c = d.createDocumentFragment(), h = "string" === typeof a, a = h ? wysihtml5.dom.getAsDom(a, d) : a; a.firstChild; ) d = a.firstChild, a.removeChild(d), (d = b(d, e)) && c.appendChild(d); a.innerHTML = ""; a.appendChild(c); return h ? wysihtml5.quirks.getCorrectInnerHTML(a) :
a
} 
} (); wysihtml5.dom.removeEmptyTextNodes = function (b) { for (var c = wysihtml5.lang.array(b.childNodes).get(), a = c.length, d = 0; d < a; d++) b = c[d], b.nodeType === wysihtml5.TEXT_NODE && "" === b.data && b.parentNode.removeChild(b) }; wysihtml5.dom.renameElement = function (b, c) { for (var a = b.ownerDocument.createElement(c), d; d = b.firstChild; ) a.appendChild(d); wysihtml5.dom.copyAttributes(["align", "className"]).from(b).to(a); b.parentNode.replaceChild(a, b); return a };
wysihtml5.dom.replaceWithChildNodes = function (b) { if (b.parentNode) if (b.firstChild) { for (var c = b.ownerDocument.createDocumentFragment(); b.firstChild; ) c.appendChild(b.firstChild); b.parentNode.replaceChild(c, b) } else b.parentNode.removeChild(b) };
(function (b) {
    function c(a) { var b = a.ownerDocument.createElement("br"); a.appendChild(b) } b.resolveList = function (a) {
        if (!("MENU" !== a.nodeName && "UL" !== a.nodeName && "OL" !== a.nodeName)) {
            var d = a.ownerDocument.createDocumentFragment(), e = a.previousElementSibling || a.previousSibling, f, g, i; for (e && "block" !== b.getStyle("display").from(e) && c(d); i = a.firstChild; ) { for (f = i.lastChild; e = i.firstChild; ) g = (g = e === f) && "block" !== b.getStyle("display").from(e) && "BR" !== e.nodeName, d.appendChild(e), g && c(d); i.parentNode.removeChild(i) } a.parentNode.replaceChild(d,
a)
        } 
    } 
})(wysihtml5.dom);
(function (b) {
    var c = document, a = "parent top opener frameElement frames localStorage globalStorage sessionStorage indexedDB".split(" "), d = "open close openDialog showModalDialog alert confirm prompt openDatabase postMessage XMLHttpRequest XDomainRequest".split(" "), e = ["referrer", "write", "open", "close"]; b.dom.Sandbox = Base.extend({ constructor: function (a, c) { this.callback = a || b.EMPTY_FUNCTION; this.config = b.lang.object({}).merge(c).get(); this.iframe = this._createIframe() }, insertInto: function (a) {
        "string" === typeof a &&
(a = c.getElementById(a)); a.appendChild(this.iframe)
    }, getIframe: function () { return this.iframe }, getWindow: function () { this._readyError() }, getDocument: function () { this._readyError() }, destroy: function () { var a = this.getIframe(); a.parentNode.removeChild(a) }, _readyError: function () { throw Error("wysihtml5.Sandbox: Sandbox iframe isn't loaded yet"); }, _createIframe: function () {
        var a = this, d = c.createElement("iframe"); d.className = "wysihtml5-sandbox"; b.dom.setAttributes({ security: "restricted", allowtransparency: "true",
            frameborder: 0, width: 0, height: 0, marginwidth: 0, marginheight: 0
        }).on(d); b.browser.throwsMixedContentWarningWhenIframeSrcIsEmpty() && (d.src = "javascript:'<html></html>'"); d.onload = function () { d.onreadystatechange = d.onload = null; a._onLoadIframe(d) }; d.onreadystatechange = function () { if (/loaded|complete/.test(d.readyState)) { d.onreadystatechange = d.onload = null; a._onLoadIframe(d) } }; return d
    }, _onLoadIframe: function (f) {
        if (b.dom.contains(c.documentElement, f)) {
            var g = this, i = f.contentWindow, h = f.contentWindow.document, k =
this._getHtml({ charset: c.characterSet || c.charset || "utf-8", stylesheets: this.config.stylesheets }); h.open("text/html", "replace"); h.write(k); h.close(); this.getWindow = function () { return f.contentWindow }; this.getDocument = function () { return f.contentWindow.document }; i.onerror = function (a, b, c) { throw Error("wysihtml5.Sandbox: " + a, b, c); }; if (!b.browser.supportsSandboxedIframes()) {
                var j, k = 0; for (j = a.length; k < j; k++) this._unset(i, a[k]); k = 0; for (j = d.length; k < j; k++) this._unset(i, d[k], b.EMPTY_FUNCTION); k = 0; for (j = e.length; k <
j; k++) this._unset(h, e[k]); this._unset(h, "cookie", "", !0)
            } this.loaded = !0; setTimeout(function () { g.callback(g) }, 0)
        } 
    }, _getHtml: function (a) { var c = a.stylesheets, d = "", e = 0, k; if (c = "string" === typeof c ? [c] : c) for (k = c.length; e < k; e++) d += '<link rel="stylesheet" href="' + c[e] + '">'; a.stylesheets = d; return b.lang.string('<!DOCTYPE html><html><head><meta charset="#{charset}">#{stylesheets}</head><body></body></html>').interpolate(a) }, _unset: function (a, c, d, e) {
        try { a[c] = d } catch (k) { } try { a.__defineGetter__(c, function () { return d }) } catch (j) { } if (e) try {
            a.__defineSetter__(c,
function () { })
        } catch (n) { } if (!b.browser.crashesWhenDefineProperty(c)) try { var p = { get: function () { return d } }; e && (p.set = function () { }); Object.defineProperty(a, c, p) } catch (q) { } 
    } 
    })
})(wysihtml5); (function () { var b = { className: "class" }; wysihtml5.dom.setAttributes = function (c) { return { on: function (a) { for (var d in c) a.setAttribute(b[d] || d, c[d]) } } } })();
wysihtml5.dom.setStyles = function (b) { return { on: function (c) { c = c.style; if ("string" === typeof b) c.cssText += ";" + b; else for (var a in b) "float" === a ? (c.cssFloat = b[a], c.styleFloat = b[a]) : c[a] = b[a] } } };
(function (b) { b.simulatePlaceholder = function (c, a, d) { var e = function () { a.hasPlaceholderSet() && a.clear(); b.removeClass(a.element, "placeholder") }, f = function () { a.isEmpty() && (a.setValue(d), b.addClass(a.element, "placeholder")) }; c.observe("set_placeholder", f).observe("unset_placeholder", e).observe("focus:composer", e).observe("paste:composer", e).observe("blur:composer", f); f() } })(wysihtml5.dom);
(function (b) { var c = document.documentElement; "textContent" in c ? (b.setTextContent = function (a, b) { a.textContent = b }, b.getTextContent = function (a) { return a.textContent }) : "innerText" in c ? (b.setTextContent = function (a, b) { a.innerText = b }, b.getTextContent = function (a) { return a.innerText }) : (b.setTextContent = function (a, b) { a.nodeValue = b }, b.getTextContent = function (a) { return a.nodeValue }) })(wysihtml5.dom);
wysihtml5.quirks.cleanPastedHTML = function () { var b = { "a u": wysihtml5.dom.replaceWithChildNodes }; return function (c, a, d) { var a = a || b, d = d || c.ownerDocument || document, e = "string" === typeof c, f, g, i, h = 0, c = e ? wysihtml5.dom.getAsDom(c, d) : c; for (i in a) { f = c.querySelectorAll(i); d = a[i]; for (g = f.length; h < g; h++) d(f[h]) } return e ? c.innerHTML : c } } ();
(function (b) {
    var c = b.dom; b.quirks.ensureProperClearing = function () { var a = function () { var a = this; setTimeout(function () { var b = a.innerHTML.toLowerCase(); if ("<p>&nbsp;</p>" == b || "<p>&nbsp;</p><p>&nbsp;</p>" == b) a.innerHTML = "" }, 0) }; return function (b) { c.observe(b.element, ["cut", "keydown"], a) } } (); b.quirks.ensureProperClearingOfLists = function () {
        var a = ["OL", "UL", "MENU"]; return function (d) {
            c.observe(d.element, "keydown", function (e) {
                if (e.keyCode === b.BACKSPACE_KEY) {
                    var f = d.selection.getSelectedNode(), e = d.element;
                    e.firstChild && b.lang.array(a).contains(e.firstChild.nodeName) && (f = c.getParentElement(f, { nodeName: a })) && f == e.firstChild && 1 >= f.childNodes.length && (f.firstChild ? "" === f.firstChild.innerHTML : 1) && f.parentNode.removeChild(f)
                } 
            })
        } 
    } ()
})(wysihtml5);
(function (b) { b.quirks.getCorrectInnerHTML = function (c) { var a = c.innerHTML; if (-1 === a.indexOf("%7E")) return a; var c = c.querySelectorAll("[href*='~'], [src*='~']"), d, e, f, g; g = 0; for (f = c.length; g < f; g++) d = c[g].href || c[g].src, e = b.lang.string(d).replace("~").by("%7E"), a = b.lang.string(a).replace(e).by(d); return a } })(wysihtml5);
(function (b) {
    var c = b.dom, a = "LI P H1 H2 H3 H4 H5 H6".split(" "), d = ["UL", "OL", "MENU"]; b.quirks.insertLineBreakOnReturn = function (e) {
        function f(a) { if (a = c.getParentElement(a, { nodeName: ["P", "DIV"] }, 2)) { var d = document.createTextNode(b.INVISIBLE_SPACE); c.insert(d).before(a); c.replaceWithChildNodes(a); e.selection.selectNode(d) } } c.observe(e.element.ownerDocument, "keydown", function (g) {
            var i = g.keyCode; if (!(g.shiftKey || i !== b.ENTER_KEY && i !== b.BACKSPACE_KEY)) {
                var h = e.selection.getSelectedNode(); (h = c.getParentElement(h,
{ nodeName: a }, 4)) ? "LI" === h.nodeName && (i === b.ENTER_KEY || i === b.BACKSPACE_KEY) ? setTimeout(function () { var a = e.selection.getSelectedNode(), b; a && ((b = c.getParentElement(a, { nodeName: d }, 2)) || f(a)) }, 0) : h.nodeName.match(/H[1-6]/) && i === b.ENTER_KEY && setTimeout(function () { f(e.selection.getSelectedNode()) }, 0) : i === b.ENTER_KEY && !b.browser.insertsLineBreaksOnReturn() && (e.commands.exec("insertLineBreak"), g.preventDefault())
            } 
        })
    } 
})(wysihtml5);
(function (b) { b.quirks.redraw = function (c) { b.dom.addClass(c, "wysihtml5-quirks-redraw"); b.dom.removeClass(c, "wysihtml5-quirks-redraw"); try { var a = c.ownerDocument; a.execCommand("italic", !1, null); a.execCommand("italic", !1, null) } catch (d) { } } })(wysihtml5);
(function (b) {
    var c = b.dom; b.Selection = Base.extend({ constructor: function (a) { window.rangy.init(); this.editor = a; this.composer = a.composer; this.doc = this.composer.doc }, getBookmark: function () { var a = this.getRange(); return a && a.cloneRange() }, setBookmark: function (a) { a && this.setSelection(a) }, setBefore: function (a) { var b = rangy.createRange(this.doc); b.setStartBefore(a); b.setEndBefore(a); return this.setSelection(b) }, setAfter: function (a) { var b = rangy.createRange(this.doc); b.setStartAfter(a); b.setEndAfter(a); return this.setSelection(b) },
        selectNode: function (a) { var d = rangy.createRange(this.doc), e = a.nodeType === b.ELEMENT_NODE, f = "canHaveHTML" in a ? a.canHaveHTML : "IMG" !== a.nodeName, g = e ? a.innerHTML : a.data, g = "" === g || g === b.INVISIBLE_SPACE, i = c.getStyle("display").from(a), i = "block" === i || "list-item" === i; if (g && e && f) try { a.innerHTML = b.INVISIBLE_SPACE } catch (h) { } f ? d.selectNodeContents(a) : d.selectNode(a); f && g && e ? d.collapse(i) : f && g && (d.setStartAfter(a), d.setEndAfter(a)); this.setSelection(d) }, getSelectedNode: function (a) {
            if (a && this.doc.selection && "Control" ===
this.doc.selection.type && (a = this.doc.selection.createRange()) && a.length) return a.item(0); a = this.getSelection(this.doc); return a.focusNode === a.anchorNode ? a.focusNode : (a = this.getRange(this.doc)) ? a.commonAncestorContainer : this.doc.body
        }, executeAndRestore: function (a, c) {
            var e = this.doc.body, f = c && e.scrollTop, g = c && e.scrollLeft, i = '<span class="_wysihtml5-temp-placeholder">' + b.INVISIBLE_SPACE + "</span>", h = this.getRange(this.doc); if (h) {
                i = h.createContextualFragment(i); h.insertNode(i); try { a(h.startContainer, h.endContainer) } catch (k) {
                    setTimeout(function () {
                        throw k;
                    }, 0)
                } (caretPlaceholder = this.doc.querySelector("._wysihtml5-temp-placeholder")) ? (h = rangy.createRange(this.doc), h.selectNode(caretPlaceholder), h.deleteContents(), this.setSelection(h)) : e.focus(); c && (e.scrollTop = f, e.scrollLeft = g); try { caretPlaceholder.parentNode.removeChild(caretPlaceholder) } catch (j) { } 
            } else a(e, e)
        }, executeAndRestoreSimple: function (a) {
            var b, c, f = this.getRange(), g = this.doc.body, i; if (f) {
                b = f.getNodes([3]); g = b[0] || f.startContainer; i = b[b.length - 1] || f.endContainer; b = g === f.startContainer ? f.startOffset :
0; c = i === f.endContainer ? f.endOffset : i.length; try { a(f.startContainer, f.endContainer) } catch (h) { setTimeout(function () { throw h; }, 0) } a = rangy.createRange(this.doc); try { a.setStart(g, b) } catch (k) { } try { a.setEnd(i, c) } catch (j) { } try { this.setSelection(a) } catch (n) { } 
            } else a(g, g)
        }, insertHTML: function (a) { var a = rangy.createRange(this.doc).createContextualFragment(a), b = a.lastChild; this.insertNode(a); b && this.setAfter(b) }, insertNode: function (a) { var b = this.getRange(); b && b.insertNode(a) }, surround: function (a) {
            var b = this.getRange();
            if (b) try { b.surroundContents(a), this.selectNode(a) } catch (c) { a.appendChild(b.extractContents()), b.insertNode(a) } 
        }, scrollIntoView: function () {
            var a = this.doc, c = a.documentElement.scrollHeight > a.documentElement.offsetHeight, e; if (!(e = a._wysihtml5ScrollIntoViewElement)) e = a.createElement("span"), e.innerHTML = b.INVISIBLE_SPACE; e = a._wysihtml5ScrollIntoViewElement = e; if (c) {
                this.insertNode(e); var c = e, f = 0; if (c.parentNode) { do f += c.offsetTop || 0, c = c.offsetParent; while (c) } c = f; e.parentNode.removeChild(e); c > a.body.scrollTop &&
(a.body.scrollTop = c)
            } 
        }, selectLine: function () { b.browser.supportsSelectionModify() ? this._selectLine_W3C() : this.doc.selection && this._selectLine_MSIE() }, _selectLine_W3C: function () { var a = this.doc.defaultView.getSelection(); a.modify("extend", "left", "lineboundary"); a.modify("extend", "right", "lineboundary") }, _selectLine_MSIE: function () {
            var a = this.doc.selection.createRange(), b = a.boundingTop, c = this.doc.body.scrollWidth, f; if (a.moveToPoint) {
                0 === b && (f = this.doc.createElement("span"), this.insertNode(f), b = f.offsetTop,
f.parentNode.removeChild(f)); b += 1; for (f = -10; f < c; f += 2) try { a.moveToPoint(f, b); break } catch (g) { } for (f = this.doc.selection.createRange(); 0 <= c; c--) try { f.moveToPoint(c, b); break } catch (i) { } a.setEndPoint("EndToEnd", f); a.select()
            } 
        }, getText: function () { var a = this.getSelection(); return a ? a.toString() : "" }, getNodes: function (a, b) { var c = this.getRange(); return c ? c.getNodes([a], b) : [] }, getRange: function () { var a = this.getSelection(); return a && a.rangeCount && a.getRangeAt(0) }, getSelection: function () {
            return rangy.getSelection(this.doc.defaultView ||
this.doc.parentWindow)
        }, setSelection: function (a) { return rangy.getSelection(this.doc.defaultView || this.doc.parentWindow).setSingleRange(a) } 
    })
})(wysihtml5);
(function (b, c) {
    function a(a, b) { return c.dom.isCharacterDataNode(a) ? 0 == b ? !!a.previousSibling : b == a.length ? !!a.nextSibling : !0 : 0 < b && b < a.childNodes.length } function d(a, b, e) { var f; c.dom.isCharacterDataNode(b) && (0 == e ? (e = c.dom.getNodeIndex(b), b = b.parentNode) : e == b.length ? (e = c.dom.getNodeIndex(b) + 1, b = b.parentNode) : f = c.dom.splitDataNode(b, e)); if (!f) { f = b.cloneNode(!1); f.id && f.removeAttribute("id"); for (var g; g = b.childNodes[e]; ) f.appendChild(g); c.dom.insertAfter(f, b) } return b == a ? f : d(a, f.parentNode, c.dom.getNodeIndex(f)) }
    function e(a) { this.firstTextNode = (this.isElementMerge = a.nodeType == b.ELEMENT_NODE) ? a.lastChild : a; this.textNodes = [this.firstTextNode] } function f(a, b, c, d) { this.tagNames = a || [g]; this.cssClass = b || ""; this.similarClassRegExp = c; this.normalize = d; this.applyToAnyTagName = !1 } var g = "span", i = /\s+/g; e.prototype = { doMerge: function () {
        for (var a = [], b, c, d = 0, e = this.textNodes.length; d < e; ++d) b = this.textNodes[d], c = b.parentNode, a[d] = b.data, d && (c.removeChild(b), c.hasChildNodes() || c.parentNode.removeChild(c)); return this.firstTextNode.data =
a = a.join("")
    }, getLength: function () { for (var a = this.textNodes.length, b = 0; a--; ) b += this.textNodes[a].length; return b }, toString: function () { for (var a = [], b = 0, c = this.textNodes.length; b < c; ++b) a[b] = "'" + this.textNodes[b].data + "'"; return "[Merge(" + a.join(",") + ")]" } 
    }; f.prototype = { getAncestorWithClass: function (a) {
        for (var d; a; ) {
            if (this.cssClass) if (d = this.cssClass, a.className) { var e = a.className.match(this.similarClassRegExp) || []; d = e[e.length - 1] === d } else d = !1; else d = !0; if (a.nodeType == b.ELEMENT_NODE && c.dom.arrayContains(this.tagNames,
a.tagName.toLowerCase()) && d) return a; a = a.parentNode
        } return !1
    }, postApply: function (a, b) {
        for (var c = a[0], d = a[a.length - 1], f = [], g, i = c, m = d, s = 0, x = d.length, o, z, w = 0, y = a.length; w < y; ++w) if (o = a[w], z = this.getAdjacentMergeableTextNode(o.parentNode, !1)) { if (g || (g = new e(z), f.push(g)), g.textNodes.push(o), o === c && (i = g.firstTextNode, s = i.length), o === d) m = g.firstTextNode, x = g.getLength() } else g = null; if (c = this.getAdjacentMergeableTextNode(d.parentNode, !0)) g || (g = new e(d), f.push(g)), g.textNodes.push(c); if (f.length) {
            w = 0; for (y =
f.length; w < y; ++w) f[w].doMerge(); b.setStart(i, s); b.setEnd(m, x)
        } 
    }, getAdjacentMergeableTextNode: function (a, c) { var d = a.nodeType == b.TEXT_NODE, e = d ? a.parentNode : a, f = c ? "nextSibling" : "previousSibling"; if (d) { if ((d = a[f]) && d.nodeType == b.TEXT_NODE) return d } else if ((d = e[f]) && this.areElementsMergeable(a, d)) return d[c ? "firstChild" : "lastChild"]; return null }, areElementsMergeable: function (a, b) {
        var d; if (d = c.dom.arrayContains(this.tagNames, (a.tagName || "").toLowerCase())) if (d = c.dom.arrayContains(this.tagNames, (b.tagName ||
"").toLowerCase())) if (d = a.className.replace(i, " ") == b.className.replace(i, " ")) a: if (a.attributes.length != b.attributes.length) d = !1; else { d = 0; for (var e = a.attributes.length, f, g; d < e; ++d) if (f = a.attributes[d], g = f.name, "class" != g && (g = b.attributes.getNamedItem(g), f.specified != g.specified || f.specified && f.nodeValue !== g.nodeValue)) { d = !1; break a } d = !0 } return d
    }, createContainer: function (a) { a = a.createElement(this.tagNames[0]); this.cssClass && (a.className = this.cssClass); return a }, applyToTextNode: function (a) {
        var b =
a.parentNode; 1 == b.childNodes.length && c.dom.arrayContains(this.tagNames, b.tagName.toLowerCase()) ? this.cssClass && (a = this.cssClass, b.className ? (b.className && (b.className = b.className.replace(this.similarClassRegExp, "")), b.className += " " + a) : b.className = a) : (b = this.createContainer(c.dom.getDocument(a)), a.parentNode.insertBefore(b, a), b.appendChild(a))
    }, isRemovable: function (a) { return c.dom.arrayContains(this.tagNames, a.tagName.toLowerCase()) && b.lang.string(a.className).trim() == this.cssClass }, undoToTextNode: function (b,
c, e) {
        c.containsNode(e) || (b = c.cloneRange(), b.selectNode(e), b.isPointInRange(c.endContainer, c.endOffset) && a(c.endContainer, c.endOffset) && (d(e, c.endContainer, c.endOffset), c.setEndAfter(e)), b.isPointInRange(c.startContainer, c.startOffset) && a(c.startContainer, c.startOffset) && (e = d(e, c.startContainer, c.startOffset))); this.similarClassRegExp && e.className && (e.className = e.className.replace(this.similarClassRegExp, "")); if (this.isRemovable(e)) {
            c = e; for (e = c.parentNode; c.firstChild; ) e.insertBefore(c.firstChild,
c); e.removeChild(c)
        } 
    }, applyToRange: function (a) { var c = a.getNodes([b.TEXT_NODE]); if (!c.length) try { var d = this.createContainer(a.endContainer.ownerDocument); a.surroundContents(d); this.selectNode(a, d); return } catch (e) { } a.splitBoundaries(); c = a.getNodes([b.TEXT_NODE]); if (c.length) { for (var f = 0, g = c.length; f < g; ++f) d = c[f], this.getAncestorWithClass(d) || this.applyToTextNode(d); a.setStart(c[0], 0); d = c[c.length - 1]; a.setEnd(d, d.length); this.normalize && this.postApply(c, a) } }, undoToRange: function (a) {
        var c = a.getNodes([b.TEXT_NODE]),
d, e; c.length ? (a.splitBoundaries(), c = a.getNodes([b.TEXT_NODE])) : (c = a.endContainer.ownerDocument.createTextNode(b.INVISIBLE_SPACE), a.insertNode(c), a.selectNode(c), c = [c]); for (var f = 0, g = c.length; f < g; ++f) d = c[f], (e = this.getAncestorWithClass(d)) && this.undoToTextNode(d, a, e); 1 == g ? this.selectNode(a, c[0]) : (a.setStart(c[0], 0), d = c[c.length - 1], a.setEnd(d, d.length), this.normalize && this.postApply(c, a))
    }, selectNode: function (a, c) {
        var d = c.nodeType === b.ELEMENT_NODE, e = "canHaveHTML" in c ? c.canHaveHTML : !0, f = d ? c.innerHTML :
c.data; if ((f = "" === f || f === b.INVISIBLE_SPACE) && d && e) try { c.innerHTML = b.INVISIBLE_SPACE } catch (g) { } a.selectNodeContents(c); f && d ? a.collapse(!1) : f && (a.setStartAfter(c), a.setEndAfter(c))
    }, getTextSelectedByRange: function (a, b) { var c = b.cloneRange(); c.selectNodeContents(a); var d = c.intersection(b), d = d ? d.toString() : ""; c.detach(); return d }, isAppliedToRange: function (a) {
        var c = [], d, e = a.getNodes([b.TEXT_NODE]); if (!e.length) return (d = this.getAncestorWithClass(a.startContainer)) ? [d] : !1; for (var f = 0, g = e.length, i; f < g; ++f) {
            i =
this.getTextSelectedByRange(e[f], a); d = this.getAncestorWithClass(e[f]); if ("" != i && !d) return !1; c.push(d)
        } return c
    }, toggleRange: function (a) { this.isAppliedToRange(a) ? this.undoToRange(a) : this.applyToRange(a) } 
    }; b.selection.HTMLApplier = f
})(wysihtml5, rangy);
wysihtml5.Commands = Base.extend({ constructor: function (b) { this.editor = b; this.composer = b.composer; this.doc = this.composer.doc }, support: function (b) { return wysihtml5.browser.supportsCommand(this.doc, b) }, exec: function (b, c) { var a = wysihtml5.commands[b], d = wysihtml5.lang.array(arguments).get(), e = a && a.exec, f = null; this.editor.fire("beforecommand:composer"); if (e) d.unshift(this.composer), f = e.apply(a, d); else try { f = this.doc.execCommand(b, !1, c) } catch (g) { } this.editor.fire("aftercommand:composer"); return f }, state: function (b,
c) { var a = wysihtml5.commands[b], d = wysihtml5.lang.array(arguments).get(), e = a && a.state; if (e) return d.unshift(this.composer), e.apply(a, d); try { return this.doc.queryCommandState(b) } catch (f) { return !1 } }, value: function (b) { var c = wysihtml5.commands[b], a = c && c.value; if (a) return a.call(c, this.composer, b); try { return this.doc.queryCommandValue(b) } catch (d) { return null } } 
});
(function (b) { b.commands.bold = { exec: function (c, a) { return b.commands.formatInline.exec(c, a, "b") }, state: function (c, a) { return b.commands.formatInline.state(c, a, "b") }, value: function () { } } })(wysihtml5);
(function (b) {
    function c(c, g) { var i = c.doc, h = "_wysihtml5-temp-" + +new Date, k = 0, j, n, p; b.commands.formatInline.exec(c, a, d, h, /non-matching-class/g); j = i.querySelectorAll(d + "." + h); for (h = j.length; k < h; k++) for (p in n = j[k], n.removeAttribute("class"), g) n.setAttribute(p, g[p]); k = n; 1 === h && (p = e.getTextContent(n), h = !!n.querySelector("*"), p = "" === p || p === b.INVISIBLE_SPACE, !h && p && (e.setTextContent(n, g.text || n.href), i = i.createTextNode(" "), c.selection.setAfter(n), c.selection.insertNode(i), k = i)); c.selection.setAfter(k) }
    var a, d = "A", e = b.dom; b.commands.createLink = { exec: function (a, b, d) { var h = this.state(a, b); h ? a.selection.executeAndRestore(function () { for (var a = h.length, b = 0, c, d, f; b < a; b++) c = h[b], d = e.getParentElement(c, { nodeName: "code" }), f = e.getTextContent(c), f.match(e.autoLink.URL_REG_EXP) && !d ? e.renameElement(c, "code") : e.replaceWithChildNodes(c) }) : (d = "object" === typeof d ? d : { href: d }, c(a, d)) }, state: function (a, c) { return b.commands.formatInline.state(a, c, "A") }, value: function () { return a } }
})(wysihtml5);
(function (b) { var c = /wysiwyg-font-size-[a-z\-]+/g; b.commands.fontSize = { exec: function (a, d, e) { return b.commands.formatInline.exec(a, d, "span", "wysiwyg-font-size-" + e, c) }, state: function (a, d, e) { return b.commands.formatInline.state(a, d, "span", "wysiwyg-font-size-" + e, c) }, value: function () { } } })(wysihtml5);
(function (b) { var c = /wysiwyg-color-[a-z]+/g; b.commands.foreColor = { exec: function (a, d, e) { return b.commands.formatInline.exec(a, d, "span", "wysiwyg-color-" + e, c) }, state: function (a, d, e) { return b.commands.formatInline.state(a, d, "span", "wysiwyg-color-" + e, c) }, value: function () { } } })(wysihtml5);
(function (b) {
    function c(a) { for (a = a.previousSibling; a && a.nodeType === b.TEXT_NODE && !b.lang.string(a.data).trim(); ) a = a.previousSibling; return a } function a(a) { for (a = a.nextSibling; a && a.nodeType === b.TEXT_NODE && !b.lang.string(a.data).trim(); ) a = a.nextSibling; return a } function d(a) { return "BR" === a.nodeName || "block" === g.getStyle("display").from(a) ? !0 : !1 } function e(a, c, d, e) {
        if (e) var f = g.observe(a, "DOMNodeInserted", function (a) {
            var a = a.target, c; a.nodeType === b.ELEMENT_NODE && (c = g.getStyle("display").from(a), "inline" !==
c.substr(0, 6) && (a.className += " " + e))
        }); a.execCommand(c, !1, d); f && f.stop()
    } function f(b, d) { b.selection.selectLine(); b.selection.surround(d); var e = a(d), f = c(d); e && "BR" === e.nodeName && e.parentNode.removeChild(e); f && "BR" === f.nodeName && f.parentNode.removeChild(f); (e = d.lastChild) && "BR" === e.nodeName && e.parentNode.removeChild(e); b.selection.selectNode(d) } var g = b.dom, i = "H1 H2 H3 H4 H5 H6 P BLOCKQUOTE DIV".split(" "); b.commands.formatBlock = { exec: function (h, k, j, n, p) {
        var q = h.doc, r = this.state(h, k, j, n, p), m, j = "string" ===
typeof j ? j.toUpperCase() : j; if (r) h.selection.executeAndRestoreSimple(function () { p && (r.className = r.className.replace(p, "")); var e = !!b.lang.string(r.className).trim(); if (!e && r.nodeName === (j || "DIV")) { var e = r, f = e.ownerDocument, h = a(e), i = c(e); h && !d(h) && e.parentNode.insertBefore(f.createElement("br"), h); i && !d(i) && e.parentNode.insertBefore(f.createElement("br"), e); g.replaceWithChildNodes(r) } else e && g.renameElement(r, "DIV") }); else {
            if (null === j || b.lang.array(i).contains(j)) if (m = h.selection.getSelectedNode(),
r = g.getParentElement(m, { nodeName: i })) { h.selection.executeAndRestoreSimple(function () { j && (r = g.renameElement(r, j)); if (n) { var a = r; a.className ? (a.className = a.className.replace(p, ""), a.className += " " + n) : a.className = n } }); return } h.commands.support(k) ? e(q, k, j || "DIV", n) : (r = q.createElement(j || "DIV"), n && (r.className = n), f(h, r))
        } 
    }, state: function (a, b, c, d, e) { c = "string" === typeof c ? c.toUpperCase() : c; a = a.selection.getSelectedNode(); return g.getParentElement(a, { nodeName: c, className: d, classRegExp: e }) }, value: function () { } 
    }
})(wysihtml5);
(function (b) {
    function c(c, f, g) { var i = c + ":" + f; if (!d[i]) { var h = d, k = b.selection.HTMLApplier, j = a[c], c = j ? [c.toLowerCase(), j.toLowerCase()] : [c.toLowerCase()]; h[i] = new k(c, f, g, !0) } return d[i] } var a = { strong: "b", em: "i", b: "strong", i: "em" }, d = {}; b.commands.formatInline = { exec: function (a, b, d, i, h) { b = a.selection.getRange(); if (!b) return !1; c(d, i, h).toggleRange(b); a.selection.setSelection(b) }, state: function (d, f, g, i, h) {
        var f = d.doc, k = a[g] || g; if (!b.dom.hasElementWithTagName(f, g) && !b.dom.hasElementWithTagName(f, k) || i &&
!b.dom.hasElementWithClassName(f, i)) return !1; d = d.selection.getRange(); return !d ? !1 : c(g, i, h).isAppliedToRange(d)
    }, value: function () { } 
    }
})(wysihtml5); (function (b) { b.commands.insertHTML = { exec: function (b, a, d) { b.commands.support(a) ? b.doc.execCommand(a, !1, d) : b.selection.insertHTML(d) }, state: function () { return !1 }, value: function () { } } })(wysihtml5);
(function (b) {
    b.commands.insertImage = { exec: function (c, a, d) {
        var d = "object" === typeof d ? d : { src: d }, e = c.doc, a = this.state(c), f; if (a) c.selection.setBefore(a), d = a.parentNode, d.removeChild(a), b.dom.removeEmptyTextNodes(d), "A" === d.nodeName && !d.firstChild && (c.selection.setAfter(d), d.parentNode.removeChild(d)), b.quirks.redraw(c.element); else {
            a = e.createElement("IMG"); for (f in d) a[f] = d[f]; c.selection.insertNode(a); b.browser.hasProblemsSettingCaretAfterImg() ? (d = e.createTextNode(b.INVISIBLE_SPACE), c.selection.insertNode(d),
c.selection.setAfter(d)) : c.selection.setAfter(a)
        } 
    }, state: function (c) { var a; if (!b.dom.hasElementWithTagName(c.doc, "IMG")) return !1; a = c.selection.getSelectedNode(); if (!a) return !1; if ("IMG" === a.nodeName) return a; if (a.nodeType !== b.ELEMENT_NODE) return !1; a = c.selection.getText(); if (a = b.lang.string(a).trim()) return !1; c = c.selection.getNodes(b.ELEMENT_NODE, function (a) { return "IMG" === a.nodeName }); return 1 !== c.length ? !1 : c[0] }, value: function (b) { return (b = this.state(b)) && b.src } 
    }
})(wysihtml5);
(function (b) { var c = "<br>" + (b.browser.needsSpaceAfterLineBreak() ? " " : ""); b.commands.insertLineBreak = { exec: function (a, d) { a.commands.support(d) ? (a.doc.execCommand(d, !1, null), b.browser.autoScrollsToCaret() || a.selection.scrollIntoView()) : a.commands.exec("insertHTML", c) }, state: function () { return !1 }, value: function () { } } })(wysihtml5);
(function (b) {
    b.commands.insertOrderedList = { exec: function (c, a) {
        var d = c.doc, e = c.selection.getSelectedNode(), f = b.dom.getParentElement(e, { nodeName: "OL" }), g = b.dom.getParentElement(e, { nodeName: "UL" }), e = "_wysihtml5-temp-" + (new Date).getTime(), i; c.commands.support(a) ? d.execCommand(a, !1, null) : f ? c.selection.executeAndRestoreSimple(function () { b.dom.resolveList(f) }) : g ? c.selection.executeAndRestoreSimple(function () { b.dom.renameElement(g, "ol") }) : (c.commands.exec("formatBlock", "div", e), i = d.querySelector("." + e),
d = "" === i.innerHTML || i.innerHTML === b.INVISIBLE_SPACE, c.selection.executeAndRestoreSimple(function () { f = b.dom.convertToList(i, "ol") }), d && c.selection.selectNode(f.querySelector("li")))
    }, state: function (c) { c = c.selection.getSelectedNode(); return b.dom.getParentElement(c, { nodeName: "OL" }) }, value: function () { } 
    }
})(wysihtml5);
(function (b) {
    b.commands.insertUnorderedList = { exec: function (c, a) {
        var d = c.doc, e = c.selection.getSelectedNode(), f = b.dom.getParentElement(e, { nodeName: "UL" }), g = b.dom.getParentElement(e, { nodeName: "OL" }), e = "_wysihtml5-temp-" + (new Date).getTime(), i; c.commands.support(a) ? d.execCommand(a, !1, null) : f ? c.selection.executeAndRestoreSimple(function () { b.dom.resolveList(f) }) : g ? c.selection.executeAndRestoreSimple(function () { b.dom.renameElement(g, "ul") }) : (c.commands.exec("formatBlock", "div", e), i = d.querySelector("." + e),
d = "" === i.innerHTML || i.innerHTML === b.INVISIBLE_SPACE, c.selection.executeAndRestoreSimple(function () { f = b.dom.convertToList(i, "ul") }), d && c.selection.selectNode(f.querySelector("li")))
    }, state: function (c) { c = c.selection.getSelectedNode(); return b.dom.getParentElement(c, { nodeName: "UL" }) }, value: function () { } 
    }
})(wysihtml5); (function (b) { b.commands.italic = { exec: function (c, a) { return b.commands.formatInline.exec(c, a, "i") }, state: function (c, a) { return b.commands.formatInline.state(c, a, "i") }, value: function () { } } })(wysihtml5);
(function (b) { var c = /wysiwyg-text-align-[a-z]+/g; b.commands.justifyCenter = { exec: function (a) { return b.commands.formatBlock.exec(a, "formatBlock", null, "wysiwyg-text-align-center", c) }, state: function (a) { return b.commands.formatBlock.state(a, "formatBlock", null, "wysiwyg-text-align-center", c) }, value: function () { } } })(wysihtml5);
(function (b) { var c = /wysiwyg-text-align-[a-z]+/g; b.commands.justifyLeft = { exec: function (a) { return b.commands.formatBlock.exec(a, "formatBlock", null, "wysiwyg-text-align-left", c) }, state: function (a) { return b.commands.formatBlock.state(a, "formatBlock", null, "wysiwyg-text-align-left", c) }, value: function () { } } })(wysihtml5);
(function (b) { var c = /wysiwyg-text-align-[a-z]+/g; b.commands.justifyRight = { exec: function (a) { return b.commands.formatBlock.exec(a, "formatBlock", null, "wysiwyg-text-align-right", c) }, state: function (a) { return b.commands.formatBlock.state(a, "formatBlock", null, "wysiwyg-text-align-right", c) }, value: function () { } } })(wysihtml5); (function (b) { b.commands.underline = { exec: function (c, a) { return b.commands.formatInline.exec(c, a, "u") }, state: function (c, a) { return b.commands.formatInline.state(c, a, "u") }, value: function () { } } })(wysihtml5);
(function (b) {
    var c = '<span id="_wysihtml5-undo" class="_wysihtml5-temp">' + b.INVISIBLE_SPACE + "</span>", a = '<span id="_wysihtml5-redo" class="_wysihtml5-temp">' + b.INVISIBLE_SPACE + "</span>", d = b.dom; b.UndoManager = b.lang.Dispatcher.extend({ constructor: function (a) { this.editor = a; this.composer = a.composer; this.element = this.composer.element; this.history = [this.composer.getValue()]; this.position = 1; this.composer.commands.support("insertHTML") && this._observe() }, _observe: function () {
        var e = this, f = this.composer.sandbox.getDocument(),
g; d.observe(this.element, "keydown", function (a) { if (!(a.altKey || !a.ctrlKey && !a.metaKey)) { var b = a.keyCode, c = 90 === b && a.shiftKey || 89 === b; 90 === b && !a.shiftKey ? (e.undo(), a.preventDefault()) : c && (e.redo(), a.preventDefault()) } }); d.observe(this.element, "keydown", function (a) { a = a.keyCode; a !== g && (g = a, (8 === a || 46 === a) && e.transact()) }); if (b.browser.hasUndoInContextMenu()) {
            var i, h, k = function () { for (var a; a = f.querySelector("._wysihtml5-temp"); ) a.parentNode.removeChild(a); clearInterval(i) }; d.observe(this.element, "contextmenu",
function () { k(); e.composer.selection.executeAndRestoreSimple(function () { e.element.lastChild && e.composer.selection.setAfter(e.element.lastChild); f.execCommand("insertHTML", !1, c); f.execCommand("insertHTML", !1, a); f.execCommand("undo", !1, null) }); i = setInterval(function () { f.getElementById("_wysihtml5-redo") ? (k(), e.redo()) : f.getElementById("_wysihtml5-undo") || (k(), e.undo()) }, 400); h || (h = !0, d.observe(document, "mousedown", k), d.observe(f, ["mousedown", "paste", "cut", "copy"], k)) })
        } this.editor.observe("newword:composer",
function () { e.transact() }).observe("beforecommand:composer", function () { e.transact() })
    }, transact: function () { var a = this.history[this.position - 1], b = this.composer.getValue(); if (b != a) { if (40 < (this.history.length = this.position)) this.history.shift(), this.position--; this.position++; this.history.push(b) } }, undo: function () { this.transact(); 1 >= this.position || (this.set(this.history[--this.position - 1]), this.editor.fire("undo:composer")) }, redo: function () {
        this.position >= this.history.length || (this.set(this.history[++this.position -
1]), this.editor.fire("redo:composer"))
    }, set: function (a) { this.composer.setValue(a); this.editor.focus(!0) } 
    })
})(wysihtml5);
wysihtml5.views.View = Base.extend({ constructor: function (b, c, a) { this.parent = b; this.element = c; this.config = a; this._observeViewChange() }, _observeViewChange: function () { var b = this; this.parent.observe("beforeload", function () { b.parent.observe("change_view", function (c) { c === b.name ? (b.parent.currentView = b, b.show(), setTimeout(function () { b.focus() }, 0)) : b.hide() }) }) }, focus: function () { if (this.element.ownerDocument.querySelector(":focus") !== this.element) try { this.element.focus() } catch (b) { } }, hide: function () {
    this.element.style.display =
"none"
}, show: function () { this.element.style.display = "" }, disable: function () { this.element.setAttribute("disabled", "disabled") }, enable: function () { this.element.removeAttribute("disabled") } 
});
(function (b) {
    var c = b.dom, a = b.browser; b.views.Composer = b.views.View.extend({ name: "composer", CARET_HACK: "<br>", constructor: function (a, b, c) { this.base(a, b, c); this.textarea = this.parent.textarea; this._initSandbox() }, clear: function () { this.element.innerHTML = a.displaysCaretInEmptyContentEditableCorrectly() ? "" : this.CARET_HACK }, getValue: function (a) { var c = this.isEmpty() ? "" : b.quirks.getCorrectInnerHTML(this.element); a && (c = this.parent.parse(c)); return c = b.lang.string(c).replace(b.INVISIBLE_SPACE).by("") }, setValue: function (a,
b) { b && (a = this.parent.parse(a)); this.element.innerHTML = a }, show: function () { this.iframe.style.display = this._displayStyle || ""; this.disable(); this.enable() }, hide: function () { this._displayStyle = c.getStyle("display").from(this.iframe); "none" === this._displayStyle && (this._displayStyle = null); this.iframe.style.display = "none" }, disable: function () { this.element.removeAttribute("contentEditable"); this.base() }, enable: function () { this.element.setAttribute("contentEditable", "true"); this.base() }, focus: function (a) {
    b.browser.doesAsyncFocus() &&
this.hasPlaceholderSet() && this.clear(); this.base(); var c = this.element.lastChild; a && c && ("BR" === c.nodeName ? this.selection.setBefore(this.element.lastChild) : this.selection.setAfter(this.element.lastChild))
}, getTextContent: function () { return c.getTextContent(this.element) }, hasPlaceholderSet: function () { return this.getTextContent() == this.textarea.element.getAttribute("placeholder") }, isEmpty: function () {
    var a = this.element.innerHTML; return "" === a || a === this.CARET_HACK || this.hasPlaceholderSet() || "" === this.getTextContent() &&
!this.element.querySelector("blockquote, ul, ol, img, embed, object, table, iframe, svg, video, audio, button, input, select, textarea")
}, _initSandbox: function () { var a = this; this.sandbox = new c.Sandbox(function () { a._create() }, { stylesheets: this.config.stylesheets }); this.iframe = this.sandbox.getIframe(); var b = document.createElement("input"); b.type = "hidden"; b.name = "_wysihtml5_mode"; b.value = 1; var f = this.textarea.element; c.insert(this.iframe).after(f); c.insert(b).after(f) }, _create: function () {
    var d = this; this.doc =
this.sandbox.getDocument(); this.element = this.doc.body; this.textarea = this.parent.textarea; this.element.innerHTML = this.textarea.getValue(!0); this.enable(); this.selection = new b.Selection(this.parent); this.commands = new b.Commands(this.parent); c.copyAttributes("className spellcheck title lang dir accessKey".split(" ")).from(this.textarea.element).to(this.element); c.addClass(this.element, this.config.composerClassName); this.config.style && this.style(); this.observe(); var e = this.config.name; e && (c.addClass(this.element,
e), c.addClass(this.iframe, e)); (e = "string" === typeof this.config.placeholder ? this.config.placeholder : this.textarea.element.getAttribute("placeholder")) && c.simulatePlaceholder(this.parent, this, e); this.commands.exec("styleWithCSS", !1); this._initAutoLinking(); this._initObjectResizing(); this._initUndoManager(); (this.textarea.element.hasAttribute("autofocus") || document.querySelector(":focus") == this.textarea.element) && setTimeout(function () { d.focus() }, 100); b.quirks.insertLineBreakOnReturn(this); a.clearsContentEditableCorrectly() ||
b.quirks.ensureProperClearing(this); a.clearsListsInContentEditableCorrectly() || b.quirks.ensureProperClearingOfLists(this); this.initSync && this.config.sync && this.initSync(); this.textarea.hide(); this.parent.fire("beforeload").fire("load")
}, _initAutoLinking: function () {
    var d = this, e = a.canDisableAutoLinking(), f = a.doesAutoLinkingInContentEditable(); e && this.commands.exec("autoUrlDetect", !1); if (this.config.autoLink) {
        (!f || f && e) && this.parent.observe("newword:composer", function () {
            d.selection.executeAndRestore(function (a,
b) { c.autoLink(b.parentNode) })
        }); var g = this.sandbox.getDocument().getElementsByTagName("a"), i = c.autoLink.URL_REG_EXP, h = function (a) { a = b.lang.string(c.getTextContent(a)).trim(); "www." === a.substr(0, 4) && (a = "http://" + a); return a }; c.observe(this.element, "keydown", function (a) { if (g.length) { var a = d.selection.getSelectedNode(a.target.ownerDocument), b = c.getParentElement(a, { nodeName: "A" }, 4), e; b && (e = h(b), setTimeout(function () { var a = h(b); a !== e && a.match(i) && b.setAttribute("href", a) }, 0)) } })
    } 
}, _initObjectResizing: function () {
    var d =
["width", "height"], e = d.length, f = this.element; this.commands.exec("enableObjectResizing", this.config.allowObjectResizing); this.config.allowObjectResizing ? a.supportsEvent("resizeend") && c.observe(f, "resizeend", function (a) { for (var a = a.target || a.srcElement, c = a.style, h = 0, k; h < e; h++) k = d[h], c[k] && (a.setAttribute(k, parseInt(c[k], 10)), c[k] = ""); b.quirks.redraw(f) }) : a.supportsEvent("resizestart") && c.observe(f, "resizestart", function (a) { a.preventDefault() })
}, _initUndoManager: function () { new b.UndoManager(this.parent) } 
    })
})(wysihtml5);
(function (b) {
    var c = b.dom, a = document, d = window, e = a.createElement("div"), f = "background-color color cursor font-family font-size font-style font-variant font-weight line-height letter-spacing text-align text-decoration text-indent text-rendering word-break word-wrap word-spacing".split(" "), g = "background-color border-collapse border-bottom-color border-bottom-style border-bottom-width border-left-color border-left-style border-left-width border-right-color border-right-style border-right-width border-top-color border-top-style border-top-width clear display float margin-bottom margin-left margin-right margin-top outline-color outline-offset outline-width outline-style padding-left padding-right padding-top padding-bottom position top left right bottom z-index vertical-align text-align -webkit-box-sizing -moz-box-sizing -ms-box-sizing box-sizing -webkit-box-shadow -moz-box-shadow -ms-box-shadow box-shadow -webkit-border-top-right-radius -moz-border-radius-topright border-top-right-radius -webkit-border-bottom-right-radius -moz-border-radius-bottomright border-bottom-right-radius -webkit-border-bottom-left-radius -moz-border-radius-bottomleft border-bottom-left-radius -webkit-border-top-left-radius -moz-border-radius-topleft border-top-left-radius width height".split(" "),
i = "width height top left right bottom".split(" "), h = ["html             { height: 100%; }", "body             { min-height: 100%; padding: 0; margin: 0; margin-top: -1px; padding-top: 1px; }", "._wysihtml5-temp { display: none; }", b.browser.isGecko ? "body.placeholder { color: graytext !important; }" : "body.placeholder { color: #a9a9a9 !important; }", "body[disabled]   { background-color: #eee !important; color: #999 !important; cursor: default !important; }", "img:-moz-broken  { -moz-force-broken-image-icon: 1; height: 24px; width: 24px; }"],
k = function (b) { if (b.setActive) try { b.setActive() } catch (e) { } else { var f = b.style, h = a.documentElement.scrollTop || a.body.scrollTop, g = a.documentElement.scrollLeft || a.body.scrollLeft, f = { position: f.position, top: f.top, left: f.left, WebkitUserSelect: f.WebkitUserSelect }; c.setStyles({ position: "absolute", top: "-99999px", left: "-99999px", WebkitUserSelect: "none" }).on(b); b.focus(); c.setStyles(f).on(b); d.scrollTo && d.scrollTo(g, h) } }; b.views.Composer.prototype.style = function () {
    var j = this, n = a.querySelector(":focus"), p = this.textarea.element,
q = p.hasAttribute("placeholder"), r = q && p.getAttribute("placeholder"); this.focusStylesHost = this.focusStylesHost || e.cloneNode(!1); this.blurStylesHost = this.blurStylesHost || e.cloneNode(!1); q && p.removeAttribute("placeholder"); p === n && p.blur(); c.copyStyles(g).from(p).to(this.iframe).andTo(this.blurStylesHost); c.copyStyles(f).from(p).to(this.element).andTo(this.blurStylesHost); c.insertCSS(h).into(this.element.ownerDocument); k(p); c.copyStyles(g).from(p).to(this.focusStylesHost); c.copyStyles(f).from(p).to(this.focusStylesHost);
    var m = b.lang.array(g).without(["display"]); n ? n.focus() : p.blur(); q && p.setAttribute("placeholder", r); if (!b.browser.hasCurrentStyleProperty()) var s = c.observe(d, "resize", function () { if (c.contains(document.documentElement, j.iframe)) { var a = c.getStyle("display").from(p), b = c.getStyle("display").from(j.iframe); p.style.display = ""; j.iframe.style.display = "none"; c.copyStyles(i).from(p).to(j.iframe).andTo(j.focusStylesHost).andTo(j.blurStylesHost); j.iframe.style.display = b; p.style.display = a } else s.stop() }); this.parent.observe("focus:composer",
function () { c.copyStyles(m).from(j.focusStylesHost).to(j.iframe); c.copyStyles(f).from(j.focusStylesHost).to(j.element) }); this.parent.observe("blur:composer", function () { c.copyStyles(m).from(j.blurStylesHost).to(j.iframe); c.copyStyles(f).from(j.blurStylesHost).to(j.element) }); return this
} 
})(wysihtml5);
(function (b) {
    var c = b.dom, a = b.browser, d = { 66: "bold", 73: "italic", 85: "underline" }; b.views.Composer.prototype.observe = function () {
        var e = this, f = this.getValue(), g = this.sandbox.getIframe(), i = this.element, h = a.supportsEventsInIframeCorrectly() ? i : this.sandbox.getWindow(), k = a.supportsEvent("drop") ? ["drop", "paste"] : ["dragdrop", "paste"]; c.observe(g, "DOMNodeRemoved", function () { clearInterval(j); e.parent.fire("destroy:composer") }); var j = setInterval(function () {
            c.contains(document.documentElement, g) || (clearInterval(j),
e.parent.fire("destroy:composer"))
        }, 250); c.observe(h, "focus", function () { e.parent.fire("focus").fire("focus:composer"); setTimeout(function () { f = e.getValue() }, 0) }); c.observe(h, "blur", function () { f !== e.getValue() && e.parent.fire("change").fire("change:composer"); e.parent.fire("blur").fire("blur:composer") }); b.browser.isIos() && c.observe(i, "blur", function () {
            var a = i.ownerDocument.createElement("input"), b = document.documentElement.scrollTop || document.body.scrollTop, c = document.documentElement.scrollLeft || document.body.scrollLeft;
            try { e.selection.insertNode(a) } catch (d) { i.appendChild(a) } a.focus(); a.parentNode.removeChild(a); window.scrollTo(c, b)
        }); c.observe(i, "dragenter", function () { e.parent.fire("unset_placeholder") }); a.firesOnDropOnlyWhenOnDragOverIsCancelled() && c.observe(i, ["dragover", "dragenter"], function (a) { a.preventDefault() }); c.observe(i, k, function (b) {
            var c = b.dataTransfer, d; c && a.supportsDataTransfer() && (d = c.getData("text/html") || c.getData("text/plain")); d ? (i.focus(), e.commands.exec("insertHTML", d), e.parent.fire("paste").fire("paste:composer"),
b.stopPropagation(), b.preventDefault()) : setTimeout(function () { e.parent.fire("paste").fire("paste:composer") }, 0)
        }); c.observe(i, "keyup", function (a) { a = a.keyCode; (a === b.SPACE_KEY || a === b.ENTER_KEY) && e.parent.fire("newword:composer") }); this.parent.observe("paste:composer", function () { setTimeout(function () { e.parent.fire("newword:composer") }, 0) }); a.canSelectImagesInContentEditable() || c.observe(i, "mousedown", function (a) { var b = a.target; "IMG" === b.nodeName && (e.selection.selectNode(b), a.preventDefault()) }); c.observe(i,
"keydown", function (a) { var b = d[a.keyCode]; if ((a.ctrlKey || a.metaKey) && !a.altKey && b) e.commands.exec(b), a.preventDefault() }); c.observe(i, "keydown", function (a) { var c = e.selection.getSelectedNode(!0), d = a.keyCode; if (c && "IMG" === c.nodeName && (d === b.BACKSPACE_KEY || d === b.DELETE_KEY)) d = c.parentNode, d.removeChild(c), "A" === d.nodeName && !d.firstChild && d.parentNode.removeChild(d), setTimeout(function () { b.quirks.redraw(i) }, 0), a.preventDefault() }); var n = { IMG: "Image: ", A: "Link: " }; c.observe(i, "mouseover", function (a) {
    var a =
a.target, b = a.nodeName; !("A" !== b && "IMG" !== b) && !a.hasAttribute("title") && (b = n[b] + (a.getAttribute("href") || a.getAttribute("src")), a.setAttribute("title", b))
})
    } 
})(wysihtml5);
(function (b) {
    b.views.Synchronizer = Base.extend({ constructor: function (b, a, d) { this.editor = b; this.textarea = a; this.composer = d; this._observe() }, fromComposerToTextarea: function (c) { this.textarea.setValue(b.lang.string(this.composer.getValue()).trim(), c) }, fromTextareaToComposer: function (b) { var a = this.textarea.getValue(); a ? this.composer.setValue(a, b) : (this.composer.clear(), this.editor.fire("set_placeholder")) }, sync: function (b) { "textarea" === this.editor.currentView.name ? this.fromTextareaToComposer(b) : this.fromComposerToTextarea(b) },
        _observe: function () {
            var c, a = this, d = this.textarea.element.form, e = function () { c = setInterval(function () { a.fromComposerToTextarea() }, 400) }, f = function () { clearInterval(c); c = null }; e(); d && (b.dom.observe(d, "submit", function () { a.sync(!0) }), b.dom.observe(d, "reset", function () { setTimeout(function () { a.fromTextareaToComposer() }, 0) })); this.editor.observe("change_view", function (b) { if (b === "composer" && !c) { a.fromTextareaToComposer(true); e() } else if (b === "textarea") { a.fromComposerToTextarea(true); f() } }); this.editor.observe("destroy:composer",
f)
        } 
    })
})(wysihtml5);
wysihtml5.views.Textarea = wysihtml5.views.View.extend({ name: "textarea", constructor: function (b, c, a) { this.base(b, c, a); this._observe() }, clear: function () { this.element.value = "" }, getValue: function (b) { var c = this.isEmpty() ? "" : this.element.value; b && (c = this.parent.parse(c)); return c }, setValue: function (b, c) { c && (b = this.parent.parse(b)); this.element.value = b }, hasPlaceholderSet: function () {
    var b = wysihtml5.browser.supportsPlaceholderAttributeOn(this.element), c = this.element.getAttribute("placeholder") || null, a = this.element.value;
    return b && !a || a === c
}, isEmpty: function () { return !wysihtml5.lang.string(this.element.value).trim() || this.hasPlaceholderSet() }, _observe: function () {
    var b = this.element, c = this.parent, a = { focusin: "focus", focusout: "blur" }, d = wysihtml5.browser.supportsEvent("focusin") ? ["focusin", "focusout", "change"] : ["focus", "blur", "change"]; c.observe("beforeload", function () {
        wysihtml5.dom.observe(b, d, function (b) { b = a[b.type] || b.type; c.fire(b).fire(b + ":textarea") }); wysihtml5.dom.observe(b, ["paste", "drop"], function () {
            setTimeout(function () { c.fire("paste").fire("paste:textarea") },
0)
        })
    })
} 
});
(function (b) {
    var c = b.dom; b.toolbar.Dialog = b.lang.Dispatcher.extend({ constructor: function (a, b) { this.link = a; this.container = b }, _observe: function () {
        if (!this._observed) {
            var a = this, d = function (b) { var c = a._serialize(); c == a.elementToChange ? a.fire("edit", c) : a.fire("save", c); a.hide(); b.preventDefault(); b.stopPropagation() }; c.observe(a.link, "click", function () { c.hasClass(a.link, "wysihtml5-command-dialog-opened") && setTimeout(function () { a.hide() }, 0) }); c.observe(this.container, "keydown", function (c) {
                var e = c.keyCode;
                e === b.ENTER_KEY && d(c); e === b.ESCAPE_KEY && a.hide()
            }); c.delegate(this.container, "[data-wysihtml5-dialog-action=save]", "click", d); c.delegate(this.container, "[data-wysihtml5-dialog-action=cancel]", "click", function (b) { a.fire("cancel"); a.hide(); b.preventDefault(); b.stopPropagation() }); for (var e = this.container.querySelectorAll("input, select, textarea"), f = 0, g = e.length, i = function () { clearInterval(a.interval) }; f < g; f++) c.observe(e[f], "change", i); this._observed = !0
        } 
    }, _serialize: function () {
        for (var a = this.elementToChange ||
{}, b = this.container.querySelectorAll("[data-wysihtml5-dialog-field]"), c = b.length, f = 0; f < c; f++) a[b[f].getAttribute("data-wysihtml5-dialog-field")] = b[f].value; return a
    }, _interpolate: function (a) { for (var b, c, f = document.querySelector(":focus"), g = this.container.querySelectorAll("[data-wysihtml5-dialog-field]"), i = g.length, h = 0; h < i; h++) b = g[h], b !== f && !(a && "hidden" === b.type) && (c = b.getAttribute("data-wysihtml5-dialog-field"), c = this.elementToChange ? this.elementToChange[c] || "" : b.defaultValue, b.value = c) }, show: function (a) {
        var b =
this, e = this.container.querySelector("input, select, textarea"); this.elementToChange = a; this._observe(); this._interpolate(); a && (this.interval = setInterval(function () { b._interpolate(!0) }, 500)); c.addClass(this.link, "wysihtml5-command-dialog-opened"); this.container.style.display = ""; this.fire("show"); if (e && !a) try { e.focus() } catch (f) { } 
    }, hide: function () { clearInterval(this.interval); this.elementToChange = null; c.removeClass(this.link, "wysihtml5-command-dialog-opened"); this.container.style.display = "none"; this.fire("hide") } 
    })
})(wysihtml5);
(function (b) {
    var c = b.dom, a = { position: "relative" }, d = { left: 0, margin: 0, opacity: 0, overflow: "hidden", padding: 0, position: "absolute", top: 0, zIndex: 1 }, e = { cursor: "inherit", fontSize: "50px", height: "50px", marginTop: "-25px", outline: 0, padding: 0, position: "absolute", right: "-4px", top: "50%" }, f = { "x-webkit-speech": "", speech: "" }; b.toolbar.Speech = function (g, i) {
        var h = document.createElement("input"); if (b.browser.supportsSpeechApiOn(h)) {
            var k = document.createElement("div"); b.lang.object(d).merge({ width: i.offsetWidth + "px", height: i.offsetHeight +
"px"
            }); c.insert(h).into(k); c.insert(k).into(i); c.setStyles(e).on(h); c.setAttributes(f).on(h); c.setStyles(d).on(k); c.setStyles(a).on(i); c.observe(h, "onwebkitspeechchange" in h ? "webkitspeechchange" : "speechchange", function () { g.execCommand("insertText", h.value); h.value = "" }); c.observe(h, "click", function (a) { c.hasClass(i, "wysihtml5-command-disabled") && a.preventDefault(); a.stopPropagation() })
        } else i.style.display = "none"
    } 
})(wysihtml5);
(function (b) {
    var c = b.dom; b.toolbar.Toolbar = Base.extend({ constructor: function (a, c) { this.editor = a; this.container = "string" === typeof c ? document.getElementById(c) : c; this.composer = a.composer; this._getLinks("command"); this._getLinks("action"); this._observe(); this.show(); for (var e = this.container.querySelectorAll("[data-wysihtml5-command=insertSpeech]"), f = e.length, g = 0; g < f; g++) new b.toolbar.Speech(this, e[g]) }, _getLinks: function (a) {
        for (var c = this[a + "Links"] = b.lang.array(this.container.querySelectorAll("[data-wysihtml5-" +
a + "]")).get(), e = c.length, f = 0, g = this[a + "Mapping"] = {}, i, h, k, j, n; f < e; f++) i = c[f], k = i.getAttribute("data-wysihtml5-" + a), j = i.getAttribute("data-wysihtml5-" + a + "-value"), h = this.container.querySelector("[data-wysihtml5-" + a + "-group='" + k + "']"), n = this._getDialog(i, k), g[k + ":" + j] = { link: i, group: h, name: k, value: j, dialog: n, state: !1}
    }, _getDialog: function (a, c) {
        var e = this, f = this.container.querySelector("[data-wysihtml5-dialog='" + c + "']"), g, i; f && (g = new b.toolbar.Dialog(a, f), g.observe("show", function () {
            i = e.composer.selection.getBookmark();
            e.editor.fire("show:dialog", { command: c, dialogContainer: f, commandLink: a })
        }), g.observe("save", function (b) { i && e.composer.selection.setBookmark(i); e._execCommand(c, b); e.editor.fire("save:dialog", { command: c, dialogContainer: f, commandLink: a }) }), g.observe("cancel", function () { e.editor.focus(!1); e.editor.fire("cancel:dialog", { command: c, dialogContainer: f, commandLink: a }) })); return g
    }, execCommand: function (a, b) {
        if (!this.commandsDisabled) {
            var c = this.commandMapping[a + ":" + b]; c && c.dialog && !c.state ? c.dialog.show() :
this._execCommand(a, b)
        } 
    }, _execCommand: function (a, b) { this.editor.focus(!1); this.composer.commands.exec(a, b); this._updateLinkStates() }, execAction: function (a) { var b = this.editor; switch (a) { case "change_view": b.currentView === b.textarea ? b.fire("change_view", "composer") : b.fire("change_view", "textarea") } }, _observe: function () {
        for (var a = this, b = this.editor, e = this.container, f = this.commandLinks.concat(this.actionLinks), g = f.length, i = 0; i < g; i++) c.setAttributes({ href: "javascript:;", unselectable: "on" }).on(f[i]); c.delegate(e,
"[data-wysihtml5-command]", "mousedown", function (a) { a.preventDefault() }); c.delegate(e, "[data-wysihtml5-command]", "click", function (b) { var c = this.getAttribute("data-wysihtml5-command"), d = this.getAttribute("data-wysihtml5-command-value"); a.execCommand(c, d); b.preventDefault() }); c.delegate(e, "[data-wysihtml5-action]", "click", function (b) { var c = this.getAttribute("data-wysihtml5-action"); a.execAction(c); b.preventDefault() }); b.observe("focus:composer", function () {
    a.bookmark = null; clearInterval(a.interval); a.interval =
setInterval(function () { a._updateLinkStates() }, 500)
}); b.observe("blur:composer", function () { clearInterval(a.interval) }); b.observe("destroy:composer", function () { clearInterval(a.interval) }); b.observe("change_view", function (b) { setTimeout(function () { a.commandsDisabled = "composer" !== b; a._updateLinkStates(); a.commandsDisabled ? c.addClass(e, "wysihtml5-commands-disabled") : c.removeClass(e, "wysihtml5-commands-disabled") }, 0) })
    }, _updateLinkStates: function () {
        var a = this.commandMapping, d = this.actionMapping, e, f, g; for (e in a) if (g =
a[e], this.commandsDisabled ? (f = !1, c.removeClass(g.link, "wysihtml5-command-active"), g.group && c.removeClass(g.group, "wysihtml5-command-active"), g.dialog && g.dialog.hide()) : (f = this.composer.commands.state(g.name, g.value), b.lang.object(f).isArray() && (f = 1 === f.length ? f[0] : !0), c.removeClass(g.link, "wysihtml5-command-disabled"), g.group && c.removeClass(g.group, "wysihtml5-command-disabled")), g.state !== f) (g.state = f) ? (c.addClass(g.link, "wysihtml5-command-active"), g.group && c.addClass(g.group, "wysihtml5-command-active"),
g.dialog && ("object" === typeof f ? g.dialog.show(f) : g.dialog.hide())) : (c.removeClass(g.link, "wysihtml5-command-active"), g.group && c.removeClass(g.group, "wysihtml5-command-active"), g.dialog && g.dialog.hide()); for (e in d) a = d[e], "change_view" === a.name && (a.state = this.editor.currentView === this.editor.textarea, a.state ? c.addClass(a.link, "wysihtml5-action-active") : c.removeClass(a.link, "wysihtml5-action-active"))
    }, show: function () { this.container.style.display = "" }, hide: function () { this.container.style.display = "none" } 
    })
})(wysihtml5);
(function (b) {
    var c = { name: void 0, style: !0, toolbar: void 0, autoLink: !0, parserRules: { tags: { br: {}, span: {}, div: {}, p: {} }, classes: {} }, parser: b.dom.parse, composerClassName: "wysihtml5-editor", bodyClassName: "wysihtml5-supported", stylesheets: [], placeholderText: void 0, allowObjectResizing: !0, supportTouchDevices: !0 }; b.Editor = b.lang.Dispatcher.extend({ constructor: function (a, d) {
        this.textareaElement = "string" === typeof a ? document.getElementById(a) : a; this.config = b.lang.object({}).merge(c).merge(d).get(); this.currentView =
this.textarea = new b.views.Textarea(this, this.textareaElement, this.config); this._isCompatible = b.browser.supported(); if (!this._isCompatible || !this.config.supportTouchDevices && b.browser.isTouchDevice()) { var e = this; setTimeout(function () { e.fire("beforeload").fire("load") }, 0) } else {
            b.dom.addClass(document.body, this.config.bodyClassName); this.currentView = this.composer = new b.views.Composer(this, this.textareaElement, this.config); "function" === typeof this.config.parser && this._initParser(); this.observe("beforeload",
function () { this.synchronizer = new b.views.Synchronizer(this, this.textarea, this.composer); this.config.toolbar && (this.toolbar = new b.toolbar.Toolbar(this, this.config.toolbar)) }); try { console.log("Heya! This page is using wysihtml5 for rich text editing. Check out https://github.com/xing/wysihtml5") } catch (f) { } 
        } 
    }, isCompatible: function () { return this._isCompatible }, clear: function () { this.currentView.clear(); return this }, getValue: function (a) { return this.currentView.getValue(a) }, setValue: function (a, b) {
        if (!a) return this.clear();
        this.currentView.setValue(a, b); return this
    }, focus: function (a) { this.currentView.focus(a); return this }, disable: function () { this.currentView.disable(); return this }, enable: function () { this.currentView.enable(); return this }, isEmpty: function () { return this.currentView.isEmpty() }, hasPlaceholderSet: function () { return this.currentView.hasPlaceholderSet() }, parse: function (a) { var c = this.config.parser(a, this.config.parserRules, this.composer.sandbox.getDocument(), !0); "object" === typeof a && b.quirks.redraw(a); return c },
        _initParser: function () { this.observe("paste:composer", function () { var a = this; a.composer.selection.executeAndRestore(function () { b.quirks.cleanPastedHTML(a.composer.element); a.parse(a.composer.element) }, !0) }); this.observe("paste:textarea", function () { this.textarea.setValue(this.parse(this.textarea.getValue())) }) } 
    })
})(wysihtml5);

!function ($, wysi) {
    "use strict";

    var templates = {
        "font-styles": "<li class='dropdown'>" +
                           "<a class='btn dropdown-toggle' data-toggle='dropdown' href='#'>" +
                               "<i class='icon-font'></i>&nbsp;<span class='current-font'>Normal text</span>&nbsp;<b class='caret'></b>" +
                           "</a>" +
                           "<ul class='dropdown-menu'>" +
                               "<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='div'>Normal text</a></li>" +
                               "<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='h1'>Heading 1</a></li>" +
                               "<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='h2'>Heading 2</a></li>" +
                           "</ul>" +
                       "</li>",
        "emphasis": "<li>" +
                           "<div class='btn-group'>" +
                               "<a class='btn' data-wysihtml5-command='bold' title='CTRL+B'>B</a>" +
                               "<a class='btn' data-wysihtml5-command='italic' title='CTRL+I'>I</a>" +
                               "<a class='btn' data-wysihtml5-command='underline' title='CTRL+U'>U</a>" +
                           "</div>" +
                       "</li>",
        "lists": "<li>" +
                           "<div class='btn-group'>" +
                               "<a class='btn' data-wysihtml5-command='insertUnorderedList' title='Unordered List'><i class='icon-list'></i></a>" +
                               "<a class='btn' data-wysihtml5-command='insertOrderedList' title='Ordered List'><i class='icon-th-list'></i></a>" +
                               "<a class='btn' data-wysihtml5-command='Outdent' title='Outdent'><i class='icon-indent-right'></i></a>" +
                               "<a class='btn' data-wysihtml5-command='Indent' title='Indent'><i class='icon-indent-left'></i></a>" +
                           "</div>" +
                       "</li>",
        "link": "<li>" +
                           "<div class='bootstrap-wysihtml5-insert-link-modal modal hide fade'>" +
                               "<div class='modal-header'>" +
                                   "<a class='close' data-dismiss='modal'>&times;</a>" +
                                   "<h3>Insert Link</h3>" +
                               "</div>" +
                               "<div class='modal-body'>" +
                                   "<input value='http://' class='bootstrap-wysihtml5-insert-link-url input-xlarge'>" +
                               "</div>" +
                               "<div class='modal-footer'>" +
                                   "<a href='#' class='btn' data-dismiss='modal'>Cancel</a>" +
                                   "<a href='#' class='btn btn-primary' data-dismiss='modal'>Insert link</a>" +
                               "</div>" +
                           "</div>" +
                           "<a class='btn' data-wysihtml5-command='createLink' title='Link'><i class='icon-share'></i></a>" +
                       "</li>",
        "image": "<li>" +
                           "<div class='bootstrap-wysihtml5-insert-image-modal modal hide fade'>" +
                               "<div class='modal-header'>" +
                                   "<a class='close' data-dismiss='modal'>&times;</a>" +
                                   "<h3>Insert Image</h3>" +
                               "</div>" +
                               "<div class='modal-body'>" +
                                   "<input value='http://' class='bootstrap-wysihtml5-insert-image-url input-xlarge'>" +
                               "</div>" +
                               "<div class='modal-footer'>" +
                                   "<a href='#' class='btn' data-dismiss='modal'>Cancel</a>" +
                                   "<a href='#' class='btn btn-primary' data-dismiss='modal'>Insert image</a>" +
                               "</div>" +
                           "</div>" +
                           "<a class='btn' data-wysihtml5-command='insertImage' title='Insert image'><i class='icon-picture'></i></a>" +
                       "</li>",

        "html":
                       "<li>" +
                           "<div class='btn-group'>" +
                               "<a class='btn' data-wysihtml5-action='change_view' title='Edit HTML'><i class='icon-pencil'></i></a>" +
                           "</div>" +
                       "</li>"
    };

    var defaultOptions = {
        "font-styles": true,
        "emphasis": true,
        "lists": true,
        "html": false,
        "link": true,
        "image": true,
        events: {},
        parserRules: {
            tags: {
                "b": {},
                "i": {},
                "br": {},
                "ol": {},
                "ul": {},
                "li": {},
                "h1": {},
                "h2": {},
                "blockquote": {},
                "u": 1,
                "img": {
                    "check_attributes": {
                        "width": "numbers",
                        "alt": "alt",
                        "src": "url",
                        "height": "numbers"
                    }
                },
                "a": {
                    set_attributes: {
                        target: "_blank",
                        rel: "nofollow"
                    },
                    check_attributes: {
                        href: "url" // important to avoid XSS
                    }
                }
            }
        },
        stylesheets: []
    };

    var Wysihtml5 = function (el, options) {
        this.el = el;
        this.toolbar = this.createToolbar(el, options || defaultOptions);
        this.editor = this.createEditor(options);

        window.editor = this.editor;

        $('iframe.wysihtml5-sandbox').each(function (i, el) {
            $(el.contentWindow).off('focus.wysihtml5').on({
                'focus.wysihtml5': function () {
                    $('li.dropdown').removeClass('open');
                }
            });
        });
    };

    Wysihtml5.prototype = {

        constructor: Wysihtml5,

        createEditor: function (options) {
            options = $.extend(defaultOptions, options || {});
            options.toolbar = this.toolbar[0];

            var editor = new wysi.Editor(this.el[0], options);

            if (options && options.events) {
                for (var eventName in options.events) {
                    editor.on(eventName, options.events[eventName]);
                }
            }

            return editor;
        },

        createToolbar: function (el, options) {
            var self = this;
            var toolbar = $("<ul/>", {
                'class': "wysihtml5-toolbar",
                'style': "display:none"
            });

            for (var key in defaultOptions) {
                var value = false;

                if (options[key] !== undefined) {
                    if (options[key] === true) {
                        value = true;
                    }
                } else {
                    value = defaultOptions[key];
                }

                if (value === true) {
                    toolbar.append(templates[key]);

                    if (key == "html") {
                        this.initHtml(toolbar);
                    }

                    if (key == "link") {
                        this.initInsertLink(toolbar);
                    }

                    if (key == "image") {
                        this.initInsertImage(toolbar);
                    }
                }
            }

            toolbar.find("a[data-wysihtml5-command='formatBlock']").click(function (e) {
                var el = $(e.srcElement);
                self.toolbar.find('.current-font').text(el.html());
            });

            this.el.before(toolbar);

            return toolbar;
        },

        initHtml: function (toolbar) {
            var changeViewSelector = "a[data-wysihtml5-action='change_view']";
            toolbar.find(changeViewSelector).click(function (e) {
                toolbar.find('a.btn').not(changeViewSelector).toggleClass('disabled');
            });
        },

        initInsertImage: function (toolbar) {
            var self = this;
            var insertImageModal = toolbar.find('.bootstrap-wysihtml5-insert-image-modal');
            var urlInput = insertImageModal.find('.bootstrap-wysihtml5-insert-image-url');
            var insertButton = insertImageModal.find('a.btn-primary');
            var initialValue = urlInput.val();

            var insertImage = function () {
                var url = urlInput.val();
                urlInput.val(initialValue);
                self.editor.composer.commands.exec("insertImage", url);
            };

            urlInput.keypress(function (e) {
                if (e.which == 13) {
                    insertImage();
                    insertImageModal.modal('hide');
                }
            });

            insertButton.click(insertImage);

            insertImageModal.on('shown', function () {
                urlInput.focus();
            });

            insertImageModal.on('hide', function () {
                self.editor.currentView.element.focus();
            });

            toolbar.find('a[data-wysihtml5-command=insertImage]').click(function () {
                insertImageModal.modal('show');
                insertImageModal.on('click.dismiss.modal', '[data-dismiss="modal"]', function (e) {
                    e.stopPropagation();
                });
                return false;
            });
        },

        initInsertLink: function (toolbar) {
            var self = this;
            var insertLinkModal = toolbar.find('.bootstrap-wysihtml5-insert-link-modal');
            var urlInput = insertLinkModal.find('.bootstrap-wysihtml5-insert-link-url');
            var insertButton = insertLinkModal.find('a.btn-primary');
            var initialValue = urlInput.val();

            var insertLink = function () {
                var url = urlInput.val();
                urlInput.val(initialValue);
                self.editor.composer.commands.exec("createLink", {
                    href: url,
                    target: "_blank",
                    rel: "nofollow"
                });
            };
            var pressedEnter = false;

            urlInput.keypress(function (e) {
                if (e.which == 13) {
                    insertLink();
                    insertLinkModal.modal('hide');
                }
            });

            insertButton.click(insertLink);

            insertLinkModal.on('shown', function () {
                urlInput.focus();
            });

            insertLinkModal.on('hide', function () {
                self.editor.currentView.element.focus();
            });

            toolbar.find('a[data-wysihtml5-command=createLink]').click(function () {
                insertLinkModal.modal('show');
                insertLinkModal.on('click.dismiss.modal', '[data-dismiss="modal"]', function (e) {
                    e.stopPropagation();
                });
                return false;
            });


        }
    };

    $.fn.wysihtml5 = function (options) {
        return this.each(function () {
            var $this = $(this);
            $this.data('wysihtml5', new Wysihtml5($this, options));
        });
    };

    $.fn.wysihtml5.Constructor = Wysihtml5;

} (window.jQuery, window.wysihtml5);

/**
* bootbox.js v2.3.1
*
* The MIT License
*
* Copyright (C) 2011-2012 by Nick Payne <nick@kurai.co.uk>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE
*/
var bootbox = window.bootbox || function () {
    function j(b, a) { null == a && (a = k); return "string" == typeof h[a][b] ? h[a][b] : a != l ? j(b, l) : b } var k = "en", l = "en", o = !0, g = {}, f = {}, h = { en: { OK: "OK", CANCEL: "Cancel", CONFIRM: "OK" }, fr: { OK: "OK", CANCEL: "Annuler", CONFIRM: "D'accord" }, de: { OK: "OK", CANCEL: "Abbrechen", CONFIRM: "Akzeptieren" }, es: { OK: "OK", CANCEL: "Cancelar", CONFIRM: "Aceptar" }, br: { OK: "OK", CANCEL: "Cancelar", CONFIRM: "Sim" }, nl: { OK: "OK", CANCEL: "Annuleren", CONFIRM: "Accepteren" }, ru: { OK: "OK", CANCEL: "\u041e\u0442\u043c\u0435\u043d\u0430",
        CONFIRM: "\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c"
    }
    }; f.setLocale = function (b) { for (var a in h) if (a == b) { k = b; return } throw Error("Invalid locale: " + b); }; f.addLocale = function (b, a) { "undefined" == typeof h[b] && (h[b] = {}); for (var c in a) h[b][c] = a[c] }; f.setIcons = function (b) { g = b; if ("object" !== typeof g || null == g) g = {} }; f.alert = function () {
        var b = "", a = j("OK"), c = null; switch (arguments.length) {
            case 1: b = arguments[0]; break; case 2: b = arguments[0]; "function" == typeof arguments[1] ? c = arguments[1] : a = arguments[1]; break;
            case 3: b = arguments[0]; a = arguments[1]; c = arguments[2]; break; default: throw Error("Incorrect number of arguments: expected 1-3");
        } return f.dialog(b, { label: a, icon: g.OK, callback: c }, { onEscape: c })
    }; f.confirm = function () {
        var b = "", a = j("CANCEL"), c = j("CONFIRM"), e = null; switch (arguments.length) {
            case 1: b = arguments[0]; break; case 2: b = arguments[0]; "function" == typeof arguments[1] ? e = arguments[1] : a = arguments[1]; break; case 3: b = arguments[0]; a = arguments[1]; "function" == typeof arguments[2] ? e = arguments[2] : c = arguments[2]; break;
            case 4: b = arguments[0]; a = arguments[1]; c = arguments[2]; e = arguments[3]; break; default: throw Error("Incorrect number of arguments: expected 1-4");
        } return f.dialog(b, [{ label: a, icon: g.CANCEL, callback: function () { "function" == typeof e && e(!1) } }, { label: c, icon: g.CONFIRM, callback: function () { "function" == typeof e && e(!0) } }])
    }; f.prompt = function () {
        var b = "", a = j("CANCEL"), c = j("CONFIRM"), e = null; switch (arguments.length) {
            case 1: b = arguments[0]; break; case 2: b = arguments[0]; "function" == typeof arguments[1] ? e = arguments[1] : a = arguments[1];
                break; case 3: b = arguments[0]; a = arguments[1]; "function" == typeof arguments[2] ? e = arguments[2] : c = arguments[2]; break; case 4: b = arguments[0]; a = arguments[1]; c = arguments[2]; e = arguments[3]; break; default: throw Error("Incorrect number of arguments: expected 1-4");
        } var m = $("<form></form>"); m.append("<input autocomplete=off type=text />"); var h = f.dialog(m, [{ label: a, icon: g.CANCEL, callback: function () { "function" == typeof e && e(null) } }, { label: c, icon: g.CONFIRM, callback: function () { "function" == typeof e && e(m.find("input[type=text]").val()) } }],
{ header: b }); h.on("shown", function () { m.find("input[type=text]").focus(); m.on("submit", function (a) { a.preventDefault(); h.find(".btn-primary").click() }) }); return h
    }; f.modal = function () {
        var b, a, c, e = { onEscape: null, keyboard: !0, backdrop: !0 }; switch (arguments.length) { case 1: b = arguments[0]; break; case 2: b = arguments[0]; "object" == typeof arguments[1] ? c = arguments[1] : a = arguments[1]; break; case 3: b = arguments[0]; a = arguments[1]; c = arguments[2]; break; default: throw Error("Incorrect number of arguments: expected 1-3"); } e.header =
a; c = "object" == typeof c ? $.extend(e, c) : e; return f.dialog(b, [], c)
    }; f.dialog = function (b, a, c) {
        var e = null, f = "", h = [], c = c || {}; null == a ? a = [] : "undefined" == typeof a.length && (a = [a]); for (var d = a.length; d--; ) {
            var g = null, j = null, k = "", l = null; if ("undefined" == typeof a[d].label && "undefined" == typeof a[d]["class"] && "undefined" == typeof a[d].callback) { var g = 0, p = null, n; for (n in a[d]) if (p = n, 1 < ++g) break; 1 == g && "function" == typeof a[d][n] && (a[d].label = p, a[d].callback = a[d][n]) } "function" == typeof a[d].callback && (l = a[d].callback);
            a[d]["class"] ? j = a[d]["class"] : d == a.length - 1 && 2 >= a.length && (j = "btn-primary"); g = a[d].label ? a[d].label : "Option " + (d + 1); a[d].icon && (k = "<i class='" + a[d].icon + "'></i> "); f += "<a data-handler='" + d + "' class='btn " + j + "' href='#'>" + k + "" + g + "</a>"; h[d] = l
        } a = ["<div class='bootbox modal'>"]; if (c.header) { d = ""; if ("undefined" == typeof c.headerCloseButton || c.headerCloseButton) d = "<a href='#' class='close'>&times;</a>"; a.push("<div class='modal-header'>" + d + "<h3>" + c.header + "</h3></div>") } a.push("<div class='modal-body'></div>");
        f && a.push("<div class='modal-footer'>" + f + "</div>"); a.push("</div>"); var i = $(a.join("\n")); ("undefined" === typeof c.animate ? o : c.animate) && i.addClass("fade"); $(".modal-body", i).html(b); i.bind("hidden", function () { i.remove() }); i.bind("hide", function () { if ("escape" == e && "function" == typeof c.onEscape) c.onEscape() }); $(document).bind("keyup.modal", function (a) { 27 == a.which && (e = "escape") }); i.bind("shown", function () { $("a.btn-primary:last", i).focus() }); i.on("click", ".modal-footer a, a.close", function (a) {
            var b = $(this).data("handler"),
b = h[b], c = null; "function" == typeof b && (c = b()); !1 !== c && (a.preventDefault(), e = "button", i.modal("hide"))
        }); null == c.keyboard && (c.keyboard = "function" == typeof c.onEscape); $("body").append(i); i.modal({ backdrop: c.backdrop || !0, keyboard: c.keyboard }); return i
    }; f.hideAll = function () { $(".bootbox").modal("hide") }; f.animate = function (b) { o = b }; return f
} ();

/* =========================================================
* bootstrap-datepicker.js 
* http://www.eyecon.ro/bootstrap-datepicker
* =========================================================
* Copyright 2012 Stefan Petre
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================= */

!function ($) {

    // Picker object

    var Datepicker = function (element, options) {
        this.element = $(element);
        this.format = DPGlobal.parseFormat(options.format || this.element.data('date-format') || 'mm/dd/yyyy');
        this.picker = $(DPGlobal.template)
							.appendTo('body')
							.on({
							    click: $.proxy(this.click, this),
							    mousedown: $.proxy(this.mousedown, this)
							});
        this.isInput = this.element.is('input');
        this.component = this.element.is('.date') ? this.element.find('.add-on') : false;

        if (this.isInput) {
            this.element.on({
                focus: $.proxy(this.show, this),
                blur: $.proxy(this.hide, this),
                keyup: $.proxy(this.update, this)
            });
        } else {
            if (this.component) {
                this.component.on('click', $.proxy(this.show, this));
            } else {
                this.element.on('click', $.proxy(this.show, this));
            }
        }

        this.viewMode = 0;
        this.weekStart = options.weekStart || this.element.data('date-weekstart') || 0;
        this.weekEnd = this.weekStart == 0 ? 6 : this.weekStart - 1;
        this.fillDow();
        this.fillMonths();
        this.update();
        this.showMode();
    };

    Datepicker.prototype = {
        constructor: Datepicker,

        show: function (e) {
            this.picker.show();
            this.height = this.component ? this.component.outerHeight() : this.element.outerHeight();
            this.place();
            $(window).on('resize', $.proxy(this.place, this));
            if (e) {
                e.stopPropagation();
                e.preventDefault();
            }
            if (!this.isInput) {
                $(document).on('mousedown', $.proxy(this.hide, this));
            }
            this.element.trigger({
                type: 'show',
                date: this.date
            });
        },

        hide: function () {
            this.picker.hide();
            $(window).off('resize', this.place);
            this.viewMode = 0;
            this.showMode();
            if (!this.isInput) {
                $(document).off('mousedown', this.hide);
            }
            this.setValue();
            this.element.trigger({
                type: 'hide',
                date: this.date
            });
        },

        setValue: function () {
            var formated = DPGlobal.formatDate(this.date, this.format);
            if (!this.isInput) {
                if (this.component) {
                    this.element.find('input').prop('value', formated);
                }
                this.element.data('date', formated);
            } else {
                this.element.prop('value', formated);
            }
        },

        place: function () {
            var offset = this.component ? this.component.offset() : this.element.offset();
            this.picker.css({
                top: offset.top + this.height,
                left: offset.left
            });
        },

        update: function () {
            this.date = DPGlobal.parseDate(
				this.isInput ? this.element.prop('value') : this.element.data('date'),
				this.format
			);
            this.viewDate = new Date(this.date);
            this.fill();
        },

        fillDow: function () {
            var dowCnt = this.weekStart;
            var html = '<tr>';
            while (dowCnt < this.weekStart + 7) {
                html += '<th class="dow">' + DPGlobal.dates.daysMin[(dowCnt++) % 7] + '</th>';
            }
            html += '</tr>';
            this.picker.find('.datepicker-days thead').append(html);
        },

        fillMonths: function () {
            var html = '';
            var i = 0
            while (i < 12) {
                html += '<span class="month">' + DPGlobal.dates.monthsShort[i++] + '</span>';
            }
            this.picker.find('.datepicker-months td').append(html);
        },

        fill: function () {
            var d = new Date(this.viewDate),
				year = d.getFullYear(),
				month = d.getMonth(),
				currentDate = this.date.valueOf();
            this.picker.find('.datepicker-days th:eq(1)')
						.text(DPGlobal.dates.months[month] + ' ' + year);
            var prevMonth = new Date(year, month - 1, 28, 0, 0, 0, 0),
				day = DPGlobal.getDaysInMonth(prevMonth.getFullYear(), prevMonth.getMonth());
            prevMonth.setDate(day);
            prevMonth.setDate(day - (prevMonth.getDay() - this.weekStart + 7) % 7);
            var nextMonth = new Date(prevMonth);
            nextMonth.setDate(nextMonth.getDate() + 42);
            nextMonth = nextMonth.valueOf();
            html = [];
            var clsName;
            while (prevMonth.valueOf() < nextMonth) {
                if (prevMonth.getDay() == this.weekStart) {
                    html.push('<tr>');
                }
                clsName = '';
                if (prevMonth.getMonth() < month) {
                    clsName += ' old';
                } else if (prevMonth.getMonth() > month) {
                    clsName += ' new';
                }
                if (prevMonth.valueOf() == currentDate) {
                    clsName += ' active';
                }
                html.push('<td class="day' + clsName + '">' + prevMonth.getDate() + '</td>');
                if (prevMonth.getDay() == this.weekEnd) {
                    html.push('</tr>');
                }
                prevMonth.setDate(prevMonth.getDate() + 1);
            }
            this.picker.find('.datepicker-days tbody').empty().append(html.join(''));
            var currentYear = this.date.getFullYear();

            var months = this.picker.find('.datepicker-months')
						.find('th:eq(1)')
							.text(year)
							.end()
						.find('span').removeClass('active');
            if (currentYear == year) {
                months.eq(this.date.getMonth()).addClass('active');
            }

            html = '';
            year = parseInt(year / 10, 10) * 10;
            var yearCont = this.picker.find('.datepicker-years')
								.find('th:eq(1)')
									.text(year + '-' + (year + 9))
									.end()
								.find('td');
            year -= 1;
            for (var i = -1; i < 11; i++) {
                html += '<span class="year' + (i == -1 || i == 10 ? ' old' : '') + (currentYear == year ? ' active' : '') + '">' + year + '</span>';
                year += 1;
            }
            yearCont.html(html);
        },

        click: function (e) {
            e.stopPropagation();
            e.preventDefault();
            var target = $(e.target).closest('span, td, th');
            if (target.length == 1) {
                switch (target[0].nodeName.toLowerCase()) {
                    case 'th':
                        switch (target[0].className) {
                            case 'switch':
                                this.showMode(1);
                                break;
                            case 'prev':
                            case 'next':
                                this.viewDate['set' + DPGlobal.modes[this.viewMode].navFnc].call(
									this.viewDate,
									this.viewDate['get' + DPGlobal.modes[this.viewMode].navFnc].call(this.viewDate) +
									DPGlobal.modes[this.viewMode].navStep * (target[0].className == 'prev' ? -1 : 1)
								);
                                this.fill();
                                break;
                        }
                        break;
                    case 'span':
                        if (target.is('.month')) {
                            var month = target.parent().find('span').index(target);
                            this.viewDate.setMonth(month);
                        } else {
                            var year = parseInt(target.text(), 10) || 0;
                            this.viewDate.setFullYear(year);
                        }
                        this.showMode(-1);
                        this.fill();
                        break;
                    case 'td':
                        if (target.is('.day')) {
                            var day = parseInt(target.text(), 10) || 1;
                            var month = this.viewDate.getMonth();
                            if (target.is('.old')) {
                                month -= 1;
                            } else if (target.is('.new')) {
                                month += 1;
                            }
                            var year = this.viewDate.getFullYear();
                            this.date = new Date(year, month, day, 0, 0, 0, 0);
                            this.viewDate = new Date(year, month, day, 0, 0, 0, 0);
                            this.fill();
                            this.setValue();
                            this.element.trigger({
                                type: 'changeDate',
                                date: this.date
                            });
                        }
                        break;
                }
            }
        },

        mousedown: function (e) {
            e.stopPropagation();
            e.preventDefault();
        },

        showMode: function (dir) {
            if (dir) {
                this.viewMode = Math.max(0, Math.min(2, this.viewMode + dir));
            }
            this.picker.find('>div').hide().filter('.datepicker-' + DPGlobal.modes[this.viewMode].clsName).show();
        }
    };

    $.fn.datepicker = function (option) {
        return this.each(function () {
            var $this = $(this),
				data = $this.data('datepicker'),
				options = typeof option == 'object' && option;
            if (!data) {
                $this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults, options))));
            }
            if (typeof option == 'string') data[option]();
        });
    };

    $.fn.datepicker.defaults = {
    };
    $.fn.datepicker.Constructor = Datepicker;

    var DPGlobal = {
        modes: [
			{
			    clsName: 'days',
			    navFnc: 'Month',
			    navStep: 1
			},
			{
			    clsName: 'months',
			    navFnc: 'FullYear',
			    navStep: 1
			},
			{
			    clsName: 'years',
			    navFnc: 'FullYear',
			    navStep: 10
			}],
        dates: {
            days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
            daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
            daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
            months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
            monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
        },
        isLeapYear: function (year) {
            return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0))
        },
        getDaysInMonth: function (year, month) {
            return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]
        },
        parseFormat: function (format) {
            var separator = format.match(/[.\/-].*?/),
				parts = format.split(/\W+/);
            if (!separator || !parts || parts.length == 0) {
                throw new Error("Invalid date format.");
            }
            return { separator: separator, parts: parts };
        },
        parseDate: function (date, format) {
            var parts = date.split(format.separator),
				date = new Date(1970, 1, 1, 0, 0, 0),
				val;
            if (parts.length == format.parts.length) {
                for (var i = 0, cnt = format.parts.length; i < cnt; i++) {
                    val = parseInt(parts[i], 10) || 1;
                    switch (format.parts[i]) {
                        case 'dd':
                        case 'd':
                            date.setDate(val);
                            break;
                        case 'mm':
                        case 'm':
                            date.setMonth(val - 1);
                            break;
                        case 'yy':
                            date.setFullYear(2000 + val);
                            break;
                        case 'yyyy':
                            date.setFullYear(val);
                            break;
                    }
                }
            }
            return date;
        },
        formatDate: function (date, format) {
            var val = {
                d: date.getDate(),
                m: date.getMonth() + 1,
                yy: date.getFullYear().toString().substring(2),
                yyyy: date.getFullYear()
            };
            val.dd = (val.d < 10 ? '0' : '') + val.d;
            val.mm = (val.m < 10 ? '0' : '') + val.m;
            var date = [];
            for (var i = 0, cnt = format.parts.length; i < cnt; i++) {
                date.push(val[format.parts[i]]);
            }
            return date.join(format.separator);
        },
        headTemplate: '<thead>' +
							'<tr>' +
								'<th class="prev"><i class="icon-arrow-left"/></th>' +
								'<th colspan="5" class="switch"></th>' +
								'<th class="next"><i class="icon-arrow-right"/></th>' +
							'</tr>' +
						'</thead>',
        contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>'
    };
    DPGlobal.template = '<div class="datepicker dropdown-menu">' +
							'<div class="datepicker-days">' +
								'<table class=" table-condensed">' +
									DPGlobal.headTemplate +
									'<tbody></tbody>' +
								'</table>' +
							'</div>' +
							'<div class="datepicker-months">' +
								'<table class="table-condensed">' +
									DPGlobal.headTemplate +
									DPGlobal.contTemplate +
								'</table>' +
							'</div>' +
							'<div class="datepicker-years">' +
								'<table class="table-condensed">' +
									DPGlobal.headTemplate +
									DPGlobal.contTemplate +
								'</table>' +
							'</div>' +
						'</div>';

} (window.jQuery);

/* =========================================================
* bootstrap-timepicker.js
* http://www.github.com/jdewit/bootstrap-timepicker
* =========================================================
* Copyright 2012
*
* Created By:
* Joris de Wit @joris_dewit
*
* Contributions By:
* Gilbert @mindeavor
* Koen Punt info@koenpunt.nl
* Nek
* Chris Martin
* Dominic Barnes contact@dominicbarnes.us
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================= */

!function ($) {

    "use strict"; // jshint ;_;

    /* TIMEPICKER PUBLIC CLASS DEFINITION
    * ================================== */
    var Timepicker = function (element, options) {
        this.$element = $(element);
        this.options = $.extend({}, $.fn.timepicker.defaults, options, this.$element.data());
        this.minuteStep = this.options.minuteStep || this.minuteStep;
        this.showMeridian = this.options.showMeridian || this.showMeridian;
        this.disableFocus = this.options.disableFocus || this.disableFocus;
        this.template = this.options.template || this.template;
        this.defaultTime = this.options.defaultTime || this.defaultTime;
        this.open = false;
        this.init();
    };

    Timepicker.prototype = {

        constructor: Timepicker

        , init: function () {

            this.$element
                .on('click', $.proxy(this.show, this))
                .on('keyup', $.proxy(this.updateFromElementVal, this))
            ;

            this.$widget = $(this.getTemplate()).appendTo('body');

            this.$widget.on('click', $.proxy(this.click, this));

            this.setDefaultTime(this.defaultTime);
        }

        , show: function (e) {
            e.stopPropagation();
            e.preventDefault();

            this.$element.trigger('show');

            $('html').on('click.timepicker.data-api', $.proxy(this.hide, this));

            if (true === this.disableFocus) {
                this.$element.blur();
            }

            var pos = $.extend({}, this.$element.offset(), {
                height: this.$element[0].offsetHeight
            });

            if (this.options.template === 'modal') {
                this.$widget.modal('show');
            } else {
                this.$widget.css({
                    top: pos.top + pos.height
                    , left: pos.left
                })

                if (!this.open) {
                    this.$widget.addClass('open');
                }
            }

            this.open = true;
            this.$element.trigger('shown');

            return this;
        }

        , hide: function () {
            this.$element.trigger('hide');

            $('html').off('click.timepicker.data-api', $.proxy(this.hide, this));

            if (this.options.template === 'modal') {
                this.$widget.modal('hide');
            } else {
                this.$widget.removeClass('open');
            }
            this.open = false;
            this.$element.trigger('hidden');

            return this;
        }

        , setValues: function (time) {
            var meridian, match = time.match(/(AM|PM)/i);
            if (match) {
                meridian = match[1];
            }
            time = $.trim(time.replace(/(PM|AM)/i, ''));
            var timeArray = time.split(':');

            this.meridian = meridian;
            this.hour = parseInt(timeArray[0], 10);
            if (isNaN(this.hour)) {
                this.hour = 0;
                this.updateElement();
            }
            this.minute = parseInt(timeArray[1], 10);
            if (isNaN(this.minute)) {
                this.minute = 0;
                this.updateElement();
            }
        }

        , setDefaultTime: function (defaultTime) {
            if (defaultTime) {
                if (defaultTime === 'current') {
                    var dTime = new Date();
                    var hours = dTime.getHours();
                    var minutes = Math.floor(dTime.getMinutes() / this.minuteStep) * this.minuteStep;
                    var meridian = "AM";
                    if (this.showMeridian) {
                        if (hours === 0) {
                            hours = 12;
                        } else if (hours >= 12) {
                            if (hours > 12) {
                                hours = hours - 12;
                            }
                            meridian = "PM";
                        } else {
                            meridian = "AM";
                        }
                    }
                    this.hour = hours;
                    this.minute = minutes;
                    this.meridian = meridian;
                } else if (defaultTime === 'value') {
                    this.setValues(this.$element.val());
                } else {
                    this.setValues(defaultTime);
                }
                this.update();
            } else {
                this.hour = 0;
                this.minute = 0;
            }
        }

        , formatTime: function (hour, minute, meridian) {
            hour = hour < 10 ? '0' + hour : hour;
            minute = minute < 10 ? '0' + minute : minute;

            return hour + ':' + minute + (this.showMeridian ? ' ' + meridian : '');
        }

        , getTime: function () {
            return this.formatTime(this.hour, this.minute, this.meridian);
        }

        , setTime: function (time) {
            this.setValues(time);
            this.update();
        }

        , updateElement: function () {
            var time = this.getTime();

            this.$element.val(time).change();
        }

        , updateWidget: function () {
            this.$widget
                .find('td.bootstrap-timepicker-hour').text(this.hour).end()
                .find('td.bootstrap-timepicker-minute').text(this.minute < 10 ? '0' + this.minute : this.minute).end()
                .find('td.bootstrap-timepicker-meridian').text(this.meridian);
        }

        , update: function () {
            this.updateElement();
            this.updateWidget();
        }

        , updateFromElementVal: function () {
            var time = this.$element.val();
            if (time) {
                this.setValues(time);
                this.updateWidget();
            }
        }

        , click: function (e) {
            e.stopPropagation();
            e.preventDefault();

            if (true !== this.disableFocus) {
                this.$element.focus();
            }

            var action = $(e.target).closest('a').data('action');
            if (action) {
                this[action]();
                this.update();
            }

        }

        , incrementHour: function () {
            if (this.showMeridian) {
                if (this.hour === 12) {
                    this.hour = 1;
                    return this.toggleMeridian();
                }
            }
            if (this.hour === 23) {
                return this.hour = 0;
            }
            this.hour = this.hour + 1;
        }

        , decrementHour: function () {
            if (this.showMeridian) {
                if (this.hour === 1) {
                    this.hour = 12;
                    return this.toggleMeridian();
                }
            }
            if (this.hour === 0) {
                return this.hour = 23;
            }
            this.hour = this.hour - 1;
        }

        , incrementMinute: function () {
            var newVal = this.minute + this.minuteStep - (this.minute % this.minuteStep);
            if (newVal > 59) {
                this.incrementHour();
                this.minute = newVal - 60;
            } else {
                this.minute = newVal;
            }
        }

        , decrementMinute: function () {
            var newVal = this.minute - this.minuteStep;
            if (newVal < 0) {
                this.decrementHour();
                this.minute = newVal + 60;
            } else {
                this.minute = newVal;
            }
        }

        , toggleMeridian: function () {
            this.meridian = this.meridian === 'AM' ? 'PM' : 'AM';

            this.update();
        }

        , getTemplate: function () {
            if (this.options.templates[this.options.template]) {
                return this.options.templates[this.options.template];
            }
            var template;
            switch (this.options.template) {
                case 'modal':
                    template = '<div class="bootstrap-timepicker modal hide fade in" style="top: 30%; margin-top: 0; width: 200px; margin-left: -100px;" data-backdrop="false">' +
                                   '<div class="modal-header">' +
                                       '<a href="#" class="close" data-action="hide">?</a>' +
                                       '<h3>Pick a Time</h3>' +
                                   '</div>' +
                                   '<div class="modal-content">' +
                                       '<table>' +
                                           '<tr>' +
                                               '<td><a href="#" data-action="incrementHour"><i class="icon-chevron-up"></i></a></td>' +
                                               '<td class="separator"></td>' +
                                               '<td><a href="#" data-action="incrementMinute"><i class="icon-chevron-up"></i></a></td>' +
                                               (this.showMeridian ? '<td><a href="#" data-action="toggleMeridian"><i class="icon-chevron-up"></i></a></td>' : '') +
                                           '</tr>' +
                                           '<tr>' +
                                               '<td class="bootstrap-timepicker-hour"></td> ' +
                                               '<td class="separator">:</td>' +
                                               '<td class="bootstrap-timepicker-minute"></td> ' +
                                               (this.showMeridian ? '<td class="bootstrap-timepicker-meridian"></td>' : '') +
                                           '</tr>' +
                                           '<tr>' +
                                               '<td><a href="#" data-action="decrementHour"><i class="icon-chevron-down"></i></a></td>' +
                                               '<td class="separator"></td>' +
                                               '<td><a href="#" data-action="decrementMinute"><i class="icon-chevron-down"></i></a></td>' +
                                               (this.showMeridian ? '<td><a href="#" data-action="toggleMeridian"><i class="icon-chevron-down"></i></a></td>' : '') +
                                           '</tr>' +
                                       '</table>' +
                                   '</div>' +
                                   '<div class="modal-footer">' +
                                       '<a href="#" class="btn btn-primary" data-action="hide">Ok</a>' +
                                   '</div>' +
                               '</div>';

                    break;
                case 'dropdown':
                    template = '<div class="bootstrap-timepicker dropdown-menu">' +
                                   '<table>' +
                                       '<tr>' +
                                           '<td><a href="#" data-action="incrementHour"><i class="icon-chevron-up"></i></a></td>' +
                                           '<td class="separator"></td>' +
                                           '<td><a href="#" data-action="incrementMinute"><i class="icon-chevron-up"></i></a></td>' +
                                           (this.showMeridian ? '<td><a href="#" data-action="toggleMeridian"><i class="icon-chevron-up"></i></a></td>' : '') +
                                       '</tr>' +
                                       '<tr>' +
                                           '<td class="bootstrap-timepicker-hour"></td> ' +
                                           '<td class="separator">:</td>' +
                                           '<td class="bootstrap-timepicker-minute"></td> ' +
                                           (this.showMeridian ? '<td class="bootstrap-timepicker-meridian"></td>' : '') +
                                       '</tr>' +
                                       '<tr>' +
                                           '<td><a href="#" data-action="decrementHour"><i class="icon-chevron-down"></i></a></td>' +
                                           '<td class="separator"></td>' +
                                           '<td><a href="#" data-action="decrementMinute"><i class="icon-chevron-down"></i></a></td>' +
                                           (this.showMeridian ? '<td><a href="#" data-action="toggleMeridian"><i class="icon-chevron-down"></i></a></td>' : '') +
                                       '</tr>' +
                                   '</table>' +
                               '</div>';
                    break;

            }
            return template;
        }
    };


    /* TIMEPICKER PLUGIN DEFINITION
    * =========================== */

    $.fn.timepicker = function (option) {
        return this.each(function () {
            var $this = $(this)
            , data = $this.data('timepicker')
            , options = typeof option == 'object' && option;
            if (!data) {
                $this.data('timepicker', (data = new Timepicker(this, options)));
            }
            if (typeof option == 'string') {
                data[option]();
            }
        })
    }

    $.fn.timepicker.defaults = {
        minuteStep: 15
    , disableFocus: false
    , defaultTime: 'current'
    , showMeridian: true
    , template: 'dropdown'
    , templates: {} // set custom templates
    }

    $.fn.timepicker.Constructor = Timepicker

    /* TIMEPICKER DATA-API
    * ================== */

    $(function () {
        $('body').on('focus.timepicker.data-api', '[data-provide="timepicker"]', function (e) {
            var $this = $(this);
            if ($this.data('timepicker')) {
                return;
            }
            e.preventDefault();
            $this.timepicker($this.data());
        })
    })
} (window.jQuery);